在wpf datagrid标头中访问复选框

hs2*_*s2d 7 c# wpf datagrid

喜,

我需要帮助找出如何访问wpf datagrid标头中的复选框.这就是我所拥有的:

<DataGrid.Columns>
    <DataGridTemplateColumn CanUserReorder="False" CanUserResize="False">
        <DataGridTemplateColumn.HeaderTemplate>
            <DataTemplate>
                <CheckBox Name="cbxAll" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" HorizontalAlignment="Center" VerticalAlignment="Center" />
            </DataTemplate>
        </DataGridTemplateColumn.HeaderTemplate>
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <CheckBox IsChecked="{Binding Path=Checked, UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding Path=NoErrors}" Name="theCheckbox" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" HorizontalAlignment="Center" VerticalAlignment="Center" />
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
</DataGrid.Columns>
Run Code Online (Sandbox Code Playgroud)

我已设置Name为复选框,但由于某种原因,我无法从代码端访问它.

我刷新数据网格项后,我需要访问复选框以取消选中它.我怎样才能做到这一点?

Joa*_*Fdz 9

MVVM中的一个工作示例:

视图模型

public class MainWindowViewModel : INotifyPropertyChanged
{
    private bool allItemsAreChecked;

    public event PropertyChangedEventHandler PropertyChanged;

    public bool AllItemsAreChecked
    {
        get
        {
            return this.allItemsAreChecked;
        }
        set
        {
            this.allItemsAreChecked = value;
            var handler = this.PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs("AllItemsAreChecked"));
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

XAML

<DataGridTemplateColumn CanUserReorder="False" CanUserResize="False">
    <DataGridTemplateColumn.HeaderTemplate>
        <DataTemplate>
            <CheckBox IsChecked="{Binding
                RelativeSource={RelativeSource AncestorType={x:Type DataGrid}},
                Path=DataContext.AllItemsAreChecked}" />
        </DataTemplate>
    </DataGridTemplateColumn.HeaderTemplate>
</DataGridTemplateColumn>
Run Code Online (Sandbox Code Playgroud)

  • 对于当前 WPF 版本,绑定应更新为: **IsChecked="{Binding Path=DataContext.AllItemsAreChecked,relativeSource={RelativeSource AncestorType={x:Type DataGrid}, Mode=FindAncestor}}"** (2认同)

Eir*_*rik 4

尽管绑定可能是您应该采用的方式,但也可以按照您的要求进行操作。这是一种方法:

1.给你的标题CheckBox一个Uid

<CheckBox Uid="CheckAll" />
Run Code Online (Sandbox Code Playgroud)

2.命名你的DataGrid

<DataGrid Name="myDataGrid" />
Run Code Online (Sandbox Code Playgroud)

3.实现以下扩展方法

public static UIElement FindUid(this DependencyObject parent, string uid)
{
    var count = VisualTreeHelper.GetChildrenCount(parent);
    if (count == 0) return null;

    for (int i = 0; i < count; i++)
    {
        var el = VisualTreeHelper.GetChild(parent, i) as UIElement;
        if (el == null) continue;

        if (el.Uid == uid) return el;

        el = el.FindUid(uid);
        if (el != null) return el;
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

CheckBox4.像这样访问并取消选中后面的代码

CheckBox checkBox = myDataGrid.FindUid("CheckAll") as CheckBox;
checkBox.IsChecked = false;
Run Code Online (Sandbox Code Playgroud)