C# 是否检查未绑定数据网格的所有列?
我有以下数据网格:C# 是否检查未绑定数据网格的所有列?,c#,wpf,datagrid,C#,Wpf,Datagrid,我有以下数据网格: 不幸的是,网格没有数据绑定,我正在尝试创建一个菜单项来选择网格中的所有项目(将第一列的值设置为选中所有内容,而不仅仅是选择行本身) 我有点不知道该怎么做。我尝试将其绑定到上下文,然后将其重置为itemsource,但收效甚微。最好的方法是什么?我最近也做了类似的功能。最好的方法是创造一种行为: 在网格上方添加复选框(全选) SelectionMode属性应为“扩展的” 创造行为 将复选框和datagrid绑定到此行为: 公众阶级行为 { } 和XAML: <Sta
不幸的是,网格没有数据绑定,我正在尝试创建一个菜单项来选择网格中的所有项目(将第一列的值设置为选中所有内容,而不仅仅是选择行本身)
我有点不知道该怎么做。我尝试将其绑定到上下文,然后将其重置为itemsource,但收效甚微。最好的方法是什么?我最近也做了类似的功能。最好的方法是创造一种行为:
SelectionMode
属性应为“扩展的”<StackPanel>
<CheckBox x:Name="CheckBox"></CheckBox>
<DataGrid local:Behaviour.SelectAll="{Binding IsChecked, ElementName=CheckBox}"></DataGrid>
</StackPanel>
我希望这有帮助。
我已经运行了这个解决方案,效果很好。我最近也做了类似的功能。最好的方法是创造一种行为:
SelectionMode
属性应为“扩展的”<StackPanel>
<CheckBox x:Name="CheckBox"></CheckBox>
<DataGrid local:Behaviour.SelectAll="{Binding IsChecked, ElementName=CheckBox}"></DataGrid>
</StackPanel>
我希望这有帮助。
我已经运行了这个解决方案,效果很好。您可以使用
RowHeaderTemplate
作为复选框,而不是使用DataGridTemplateColumn。然后将复选框的IsChecked属性绑定到DataGridRow的IsSelected属性。这样,无论何时选择一行,都会选中复选框,反之亦然
<DataGrid x:Name="DataGridOrderItems" PreviewMouseLeftButtonDown="dataGridOrderItems_PreviewMouseLeftButtonDown" SelectionMode="Extended" SelectionUnit="FullRow" ...>
<DataGrid.Columns>
<DataGridTextColumn Header="Resource Id" Binding="{Binding ResourceId}" IsReadOnly="True"/>
<DataGridTextColumn Header="Resource Name" Binding="{Binding DisplayTitle}" IsReadOnly="True"/>
<DataGridTextColumn Header="Quantity" Binding="{Binding Quantity}" />
<DataGridTextColumn Header="Type" Binding="{Binding ResourceType}" IsReadOnly="True"/>
<DataGridTextColumn Header="Order Date" Binding="{Binding OrderDate, StringFormat=\{0:d\}}" IsReadOnly="True" />
<DataGridTextColumn Header="Status" Binding="{Binding Status}" IsReadOnly="True"/>
</DataGrid.Columns>
<DataGrid.ContextMenu>
<ContextMenu >
<MenuItem Header="Select All" Click="SelectAllDatagridOrderItems" />
</ContextMenu>
</DataGrid.ContextMenu>
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=IsSelected, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}}"/>
</DataTemplate>
</DataGrid.RowHeaderTemplate>
</DataGrid>
此外,为了选择多行,SelectionMode
应该是Extended
让用户更容易选择多行的一种方法是处理DataGrid的PreviewMouseLeftButtonDown
事件。然后,使用VisualTreeHelper
查找DataGridRow并选择/取消选择它
private void dataGridOrderItems_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
DependencyObject depObj = (DependencyObject)e.OriginalSource;
while (depObj != null && !(depObj is DataGridRow))
{
depObj = VisualTreeHelper.GetParent(depObj);
}
if (depObj != null && depObj is DataGridRow)
{
DataGridRow dgRow = (DataGridRow)depObj;
dgRow.IsSelected = !dgRow.IsSelected;
e.Handled = true;
}
}
使用此选项,用户可以选择多行而无需按住Ctrl键。复选框检查系统仍然有效。您可以使用
RowHeaderTemplate
作为复选框,而不是使用DataGridTemplateColumn。然后将复选框的IsChecked属性绑定到DataGridRow的IsSelected属性。这样,无论何时选择一行,都会选中复选框,反之亦然
<DataGrid x:Name="DataGridOrderItems" PreviewMouseLeftButtonDown="dataGridOrderItems_PreviewMouseLeftButtonDown" SelectionMode="Extended" SelectionUnit="FullRow" ...>
<DataGrid.Columns>
<DataGridTextColumn Header="Resource Id" Binding="{Binding ResourceId}" IsReadOnly="True"/>
<DataGridTextColumn Header="Resource Name" Binding="{Binding DisplayTitle}" IsReadOnly="True"/>
<DataGridTextColumn Header="Quantity" Binding="{Binding Quantity}" />
<DataGridTextColumn Header="Type" Binding="{Binding ResourceType}" IsReadOnly="True"/>
<DataGridTextColumn Header="Order Date" Binding="{Binding OrderDate, StringFormat=\{0:d\}}" IsReadOnly="True" />
<DataGridTextColumn Header="Status" Binding="{Binding Status}" IsReadOnly="True"/>
</DataGrid.Columns>
<DataGrid.ContextMenu>
<ContextMenu >
<MenuItem Header="Select All" Click="SelectAllDatagridOrderItems" />
</ContextMenu>
</DataGrid.ContextMenu>
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=IsSelected, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}}"/>
</DataTemplate>
</DataGrid.RowHeaderTemplate>
</DataGrid>
此外,为了选择多行,SelectionMode
应该是Extended
让用户更容易选择多行的一种方法是处理DataGrid的PreviewMouseLeftButtonDown
事件。然后,使用VisualTreeHelper
查找DataGridRow并选择/取消选择它
private void dataGridOrderItems_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
DependencyObject depObj = (DependencyObject)e.OriginalSource;
while (depObj != null && !(depObj is DataGridRow))
{
depObj = VisualTreeHelper.GetParent(depObj);
}
if (depObj != null && depObj is DataGridRow)
{
DataGridRow dgRow = (DataGridRow)depObj;
dgRow.IsSelected = !dgRow.IsSelected;
e.Handled = true;
}
}
使用此选项,用户可以选择多行而无需按住Ctrl键。并且复选框检查系统仍然工作。正常。我想钱终于掉下来了 我改变了XAML,但行为还是一样。 新的XAML:
<DataGrid local:Behaviour.SelectAll="False"
AutoGenerateColumns="False"
x:Name="DataGrid"
ItemsSource="{Binding Items}"
HorizontalGridLinesBrush="LightGray"
AlternatingRowBackground="Beige"
AlternationCount="2"
SelectionMode="Extended"
SelectionUnit="FullRow">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Select">
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=(local:Behaviour.SelectAll),RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGrid}}}"/>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Item"
Binding="{Binding Item}"
IsReadOnly="True" />
</DataGrid.Columns>
</DataGrid>
我相信这正是你所需要的。好的。我想钱终于掉下来了 我改变了XAML,但行为还是一样。 新的XAML:
<DataGrid local:Behaviour.SelectAll="False"
AutoGenerateColumns="False"
x:Name="DataGrid"
ItemsSource="{Binding Items}"
HorizontalGridLinesBrush="LightGray"
AlternatingRowBackground="Beige"
AlternationCount="2"
SelectionMode="Extended"
SelectionUnit="FullRow">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Select">
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=(local:Behaviour.SelectAll),RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGrid}}}"/>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Item"
Binding="{Binding Item}"
IsReadOnly="True" />
</DataGrid.Columns>
</DataGrid>
我相信它应该正是您所需要的。尽管这会起作用,但它对用户的友好程度要低得多(用户必须按住control键才能选择多行)。我提供了一种方法,让用户在不按住Ctrl键的情况下选择多行。也许它是有用的。虽然这会起作用,但它的用户友好性要差得多(用户被迫按住Ctrl键来选择多行)。我已经介绍了一种方法,让用户在不按住Ctrl键的情况下选择多行。也许它会有用。理论上很好,但我最初遇到的问题相同-SelectAll()无法处理此属性。听起来很奇怪。我以前做过不止一次,而且我从未坚持使用SelectAll()。你的物品来源是什么?你能给我完整的密码吗?稍后我将运行它以检测问题。首先,删除所有不重要的属性设置,以确定哪些属性会造成问题。您是否已将SelectionMode从Single删除为Extended?理论上很好,但与我最初遇到的问题相同-SelectAll()无法使用此属性。听起来很奇怪。我以前做过不止一次,而且我从未坚持使用SelectAll()。你的物品来源是什么?你能给我完整的密码吗?稍后我将运行它以检测问题。首先,删除所有不重要的属性设置,以确定哪些属性会造成问题。您是否已将SelectionMode从单一模式删除为扩展模式?我添加了新解决方案。我添加了新解决方案。