我正在尝试为DataGrid实现列选择器功能,如果我尝试将列的标题内容定义为不仅仅是一个字符串,那么我遇到了问题.下面是一个非常简化的示例,其中所有样式,视图模型,绑定等都被剥离.
共有3列:
第一列使用标题字符串.第二列尝试使用工具提示将标题内容设置为Label.第三列绑定使用ToolTip将标题内容设置为TextBlock.
单击列A的"切换可见性"按钮可以正常工作.列B和C的"切换可见性"按钮会导致InvalidOperationException,并显示消息"指定的元素已经是另一个元素的逻辑子元素.首先断开它".
<Window x:Class="DataGridColumnChoosing.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal" Margin="0,10">
<TextBlock Margin="15, 0">Toggle Visibility:</TextBlock>
<Button Click="ToggleA">Column A</Button>
<Button Click="ToggleB">Column B</Button>
<Button Click="ToggleC">Column C</Button>
</StackPanel>
<!-- Main Fuel Mileage Datagrid -->
<DataGrid x:Name="mySampleDataGrid" Grid.Row="1"
AutoGenerateColumns="False" CanUserSortColumns="False" CanUserResizeRows="False" CanUserAddRows="False"
GridLinesVisibility="All" RowHeaderWidth="0">
<DataGrid.Columns>
<DataGridTemplateColumn x:Name="colA" Width="40*" IsReadOnly="True" Header="Column A">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn x:Name="colB" Width="40*" IsReadOnly="True" >
<DataGridTemplateColumn.Header>
<Label Content="Column B" ToolTip="A short explanation of Column …Run Code Online (Sandbox Code Playgroud) 在我们的应用程序中,我们使用datagrids来布局填充了模板化内容和按钮的行,但是间歇性地出现问题,其中某些列有时会将自身的大小调整为列的最小宽度,有时会调整到列标题内容宽度.这似乎与设置itemssource的时间和加载事件发生的时间有关,但我无法确定它.
行为不正确的示例

正确行为的示例

itemssource绑定到viewmodel上的ObservableCollection,它使用async和await关键字以及dataservice填充异步.
我试图通过隐藏初始化中的所有列来解决问题,然后一旦设置了itemssource并调用了isloaded,将所有列设置回初始可见性,这似乎有一些影响,但没有完全解决问题.
列定义的xaml
<Style x:Key="MainDataGridColumnHeader" TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
<TextBlock Text="{TemplateBinding Content}" Foreground="{StaticResource HighlightedTextBrush}"
Background="Transparent"
FontSize="16" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="MainDataGridRow" TargetType="{x:Type DataGridRow}">
<Setter Property="Background" Value="{StaticResource LightBackgroundBrush}" />
<Setter Property="BorderBrush" Value="{StaticResource Faded10MidBackgroundBrush}"/>
<Setter Property="BorderThickness" Value="0,0,0,1" />
<Setter Property="SnapsToDevicePixels" Value="true" />
<Setter Property="Padding" Value="5"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridRow}">
<Border x:Name="DGR_Border"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}"
SnapsToDevicePixels="True"
CornerRadius="0"
Margin="0,5"
Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}">
<SelectiveScrollingGrid>
<SelectiveScrollingGrid.ColumnDefinitions>
<ColumnDefinition Width="Auto" …Run Code Online (Sandbox Code Playgroud) 我正在创建一个带有a的WPF窗口DataGrid,我想在网格底部显示空白的"新项目"行,允许我向网格添加新项目.由于某种原因,我的窗口上的网格上没有显示空白行.这是我用来创建的标记DataGrid:
<toolkit:DataGrid x:Name="ProjectTasksDataGrid"
DockPanel.Dock="Top"
Style="{DynamicResource {x:Static res:SharedResources.FsBlueGridKey}}"
AutoGenerateColumns="False"
ItemsSource="{Binding SelectedProject.Tasks}"
RowHeaderWidth="0"
MouseMove="OnStartDrag"
DragEnter="OnCheckDropTarget"
DragOver="OnCheckDropTarget"
DragLeave="OnCheckDropTarget"
Drop="OnDrop"
InitializingNewItem="ProjectTasksDataGrid_InitializingNewItem">
<toolkit:DataGrid.Columns>
<toolkit:DataGridCheckBoxColumn HeaderTemplate="{DynamicResource {x:Static res:SharedResources.CheckmarkHeaderKey}}" Width="25" Binding="{Binding Completed}" IsReadOnly="false"/>
<toolkit:DataGridTextColumn Header="Days" Width="75" Binding="{Binding NumDays}" IsReadOnly="false"/>
<toolkit:DataGridTextColumn Header="Due Date" Width="75" Binding="{Binding DueDate, Converter={StaticResource standardDateConverter}}" IsReadOnly="false"/>
<toolkit:DataGridTextColumn Header="Description" Width="*" Binding="{Binding Description}" IsReadOnly="false"/>
</toolkit:DataGrid.Columns>
</toolkit:DataGrid>
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚为什么空白行没有显示.我尝试了明显的东西(IsReadOnly="false",CanUserAddRows="True"),没有运气.知道空行被禁用的原因吗?谢谢你的帮助.
WPF Datagrid有两种选择模式,Single或Extended.WPF ListView有第三个 - 多个.此模式允许您单击并选择多行而不按住CTRL或Shift.任何人都知道如何为datagrid做这个?
我试图弄清楚如何使用MVVM模式将WPF DataGrid的列标题和主数据绑定到数据源.我正在寻找的结果将是这样的:
alt text http://brian.vallelunga.com/files/datagrid-custom-headers.PNG
我已成功设置了标题,但我不确定如何绑定标题中的值.具体来说,复选框的IsChecked属性,组合框的选定索引和文本框的值.
我以前使用一个简单的DataTable来填充主网格数据,但是我需要更复杂的东西来保存网格数据和每列的值.或许我可以完全将它们存储为单独的实体.
那么,有没有人知道如何实现这种约束?一个限制是列必须是自动生成的,因为我不知道它们在运行时会是什么.应用程序只是从Excel电子表格加载数据,并且可能存在任意数量的列.
谢谢,Brian
我有一个WPF数据网格(从标题指示的WPF工具包),我想要一些列之间的差距,甚至没有标题在上面,你可以看到之间的背景.我不知道如何管理这个.
顺便说一句,我的所有列都是TemplateColumns,但我更喜欢一个解决方案,我不需要为每一列设置样式,而且它的标题在一侧有一个gab.也许是类似的东西<DataGridGapColum Width="5" />,不幸的是,这样的事情并不存在.
细节
我有一个WPF Datagrid,它从Linq-sql查询Datacontext数据项加载.结果集包含大约200k行,加载它们,排序,过滤等很慢.提高速度的简单方法是什么?
我看到的几件事情都是Scrollview,数据虚拟化等人们也谈论了Paging,Profiling等
我希望保护DataGrid的某些行以防止用户删除,尽管该属性CanUserDeleteRows设置为true.
是否有可能保护某些行,希望通过数据绑定或触发器?ItemsSource绑定到T的ObservableCollection.
我正在使用WPF数据网格.在数据网格中,用户具有列标题和行标题.
当列标题和行标题都可见时,在左上角我们有一个小的方形部分可用.(列和行标题相交的左上角的横截面.)当我们点击它时,它会选择数据网格中的所有单元格.那有什么事吗?如果不是如何陷阱那个事件.请指导我.
如果您需要有关此问题的任何其他信息,请与我们联系.
此致,Priyank
我想将所有datagrid记录复制到datatable而不使用任何循环.对于Ex:
Dim dt as New DataTable
dt = Datagrid1.Items
Run Code Online (Sandbox Code Playgroud)
但这不是工作并给出错误信息.
我的开发平台是Visual Studio 2010,语言是WPF和vb.net 4.0
wpf ×10
wpfdatagrid ×10
datagrid ×4
c# ×3
.net ×2
wpftoolkit ×2
xaml ×2
binding ×1
columnheader ×1
selection ×1
vb.net ×1
wpf-4.0 ×1