C# 是否检查未绑定数据网格的所有列?

C# 是否检查未绑定数据网格的所有列?,c#,wpf,datagrid,C#,Wpf,Datagrid,我有以下数据网格: 不幸的是,网格没有数据绑定,我正在尝试创建一个菜单项来选择网格中的所有项目(将第一列的值设置为选中所有内容,而不仅仅是选择行本身) 我有点不知道该怎么做。我尝试将其绑定到上下文,然后将其重置为itemsource,但收效甚微。最好的方法是什么?我最近也做了类似的功能。最好的方法是创造一种行为: 在网格上方添加复选框(全选) SelectionMode属性应为“扩展的” 创造行为 将复选框和datagrid绑定到此行为: 公众阶级行为 { } 和XAML: <Sta

我有以下数据网格:


不幸的是,网格没有数据绑定,我正在尝试创建一个菜单项来选择网格中的所有项目(将第一列的值设置为选中所有内容,而不仅仅是选择行本身)


我有点不知道该怎么做。我尝试将其绑定到上下文,然后将其重置为itemsource,但收效甚微。最好的方法是什么?

我最近也做了类似的功能。最好的方法是创造一种行为:

  • 在网格上方添加复选框(全选)

  • SelectionMode
    属性应为“扩展的

  • 创造行为

  • 将复选框和datagrid绑定到此行为:

    公众阶级行为 {

    }

  • 和XAML:

    <StackPanel>
        <CheckBox x:Name="CheckBox"></CheckBox>
        <DataGrid local:Behaviour.SelectAll="{Binding IsChecked, ElementName=CheckBox}"></DataGrid>
    </StackPanel>
    
    
    
    我希望这有帮助。
    我已经运行了这个解决方案,效果很好。

    我最近也做了类似的功能。最好的方法是创造一种行为:

  • 在网格上方添加复选框(全选)

  • SelectionMode
    属性应为“扩展的

  • 创造行为

  • 将复选框和datagrid绑定到此行为:

    公众阶级行为 {

    }

  • 和XAML:

    <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从单一模式删除为扩展模式?我添加了新解决方案。我添加了新解决方案。