具有双向绑定的 WPF DataGrid SelectAll Checkbox
WPF DataGrid SelectAll Checkbox with two-way binding
我将一个 DataGrid 绑定到一个列表,它有一个布尔值 属性 "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;
}
}
其中 class 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>
其中 Select-All 复选框的选中和未选中事件的事件处理程序是这样的:
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 属性,但视图未针对此更改进行更新。看起来预期的双向绑定并没有以某种方式发生。
我的猜测是我应该用一些接口实现 BaselineEntity class 以将通知推送到视图(这是我对 knockout js 的一些工作知识所期望的,但不能花几个小时后找到它是什么)。
我不知道我在这里还缺少什么..我只是找不到可能的解决方案。
感谢任何 help/guidance..
谢谢!
参考下面模型代码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));
}
}
}
我将一个 DataGrid 绑定到一个列表,它有一个布尔值 属性 "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;
}
}
其中 class 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>
其中 Select-All 复选框的选中和未选中事件的事件处理程序是这样的:
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 属性,但视图未针对此更改进行更新。看起来预期的双向绑定并没有以某种方式发生。
我的猜测是我应该用一些接口实现 BaselineEntity class 以将通知推送到视图(这是我对 knockout js 的一些工作知识所期望的,但不能花几个小时后找到它是什么)。
我不知道我在这里还缺少什么..我只是找不到可能的解决方案。
感谢任何 help/guidance..
谢谢!
参考下面模型代码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));
}
}
}