c# - 具有双向绑定(bind)的 WPF DataGrid SelectAll 复选框

标签 c# wpf datagrid

我将 DataGrid 绑定(bind)到列表,该列表具有 bool 属性“IsSelected”。

public partial class MainWindow : Window
{
  List<BaselineEntity> _blRecs;

  public MainWindow()
  {
    InitializeComponent();

    _blRecs = new List<BaselineEntity>();

    _blRecs.Add(new BaselineEntity{EntityId = "Yada_Yada_1", IsSelected = false});
    _blRecs.Add(new BaselineEntity{EntityId = "Yada_Yada_2", IsSelected = false});
    _blRecs.Add(new BaselineEntity{EntityId = "Yada_Yada_2", IsSelected = false});

    ChangedBlRecsGridView.ItemsSource = _blRecs;
  }
}

BaselineEntity 类定义为:

internal class BaselineEntity
{
    public string EntityId {get; set;}
    public bool IsSelected { get; set; }
}

XAML是这样的

<DataGrid Name="ChangedBlRecsGridView" 
          ItemsSource="{Binding _blRecs, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Entity Id" Binding="{Binding EntityId}"></DataGridTextColumn>

        <DataGridTemplateColumn Width="30">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox IsChecked="{Binding Path=IsSelected, UpdateSourceTrigger=PropertyChanged}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.Header>
                <CheckBox Name="chkSelectAll" Checked="chkSelectAll_Checked" Unchecked="chkSelectAll_Unchecked"></CheckBox>
            </DataGridTemplateColumn.Header>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

全选复选框的选中和未选中事件的事件处理程序如下所示:

private void chkSelectAll_Checked(object sender, RoutedEventArgs e)
{
    foreach (BaselineEntity enty in ChangedBlRecsGridView.ItemsSource)
    {
        enty.IsSelected = true;
    }
}

private void chkSelectAll_Unchecked(object sender, RoutedEventArgs e)
{
    foreach (BaselineEntity enty in ChangedBlRecsGridView.ItemsSource)
    {
            enty.IsSelected = false;
    }
}

我熟悉 MVVM,并且我知道我没有坚持任何最佳实践(例如实现 viewModel),因为我刚刚开始使用 WPF。

Check 和 Uncheck 事件处理程序设置并重置 IsSelected 属性,但 View 不会更新有关此更改的信息。看来预期的双向绑定(bind)没有发生。

我的猜测是,我应该使用一些接口(interface)来实现 BaselineEntity 类,以将通知推送到 View (这是我从我对 Knockout js 的一些工作知识中所期望的,但在花费之后找不到它是什么小时)。

我不知道我还缺少什么。我只是找不到解决方案。

感谢任何帮助/指导..

谢谢!

最佳答案

使用 INotifyPropertyChanged 引用以下模型代码

 internal class BaselineEntity:INotifyPropertyChanged
{
    public string EntityId { get; set; }

    private bool isSelected;

    public bool IsSelected
    {
        get { return isSelected; }
        set { isSelected = value; OnPropertyChanged("IsSelected"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }
    }
}

关于c# - 具有双向绑定(bind)的 WPF DataGrid SelectAll 复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29548142/

相关文章:

C# 防止 RichTextBox 滚动/跳转到顶部

c# - 这是简化继承类的有效方法吗?

c# - RavenDB Map Reduce Transform 折叠不同的字符串列表

wpf - ReactiveUI 生产准备好了吗?

c# - 在 C# 中重写此 If 的最简洁/最惯用的方法

c# - 为什么刷新列表后列表中的选定项目会移动到不同的屏幕位置

c# - PropertyChanged.Fody 和 PropertyObserver

c# - WPF DataGrid 禁用的单元格正在接收文本输入

c# - 如何向 DataGridRowGroupHeader 添加其他数据?

c# - 如何根据条件在 Wpf DataGrid 中的选定项目后获取项目?