我有一个绑定到名为“Personnel”的ObservableCollection的WPF DataGrid。我在DataGrid中有一个可编辑的DataGridCheckBoxColumn。 CheckBoxColumn绑定到我的集合中名为“AircraftCommanderSelected”的bool值。选中一行并选中复选框后,将触发一个事件来更新集合,以便将每个“Personnel”的所有AircraftCommanderSelected值设置为false(除了刚刚设置为true的值)。话虽如此,我的集合正在正确更新,但我的数据网格不会“取消选中”以前选中的框,其绑定值已更改为false。如何通知值已更改?下面是我的代码(为便于阅读而修改)。
类
public class Personnel
{
///
///Other objects removed for reading purposes. All follow same format.
///
private bool aircraftCommanderSelected;
public bool AircrafCommanderSelected
{
get { return this.aircraftCommanderSelected; }
set
{
if(this.aircraftCommanderSelected != value)
{
this.aircraftCommanderSelected = value;
this.NotifyPropertyChanged("AircraftCommanderSelected");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(strin propName)
{
if(this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
}
XAML
<DataGrid Name="dataGrid" AutoGenerateColumns="False" SelectedItem="{Binding Personnel}" CanUserDeleteRows="False" CanUserAddRows="False" IsReadOnly="False" SelectionMode="Single" CellEditEnding="dataGrid_CellEditEnding">
<DataGrid.Columns>
<DataGridCheckBoxColumn local:DataGridUtil.Name="ac" Header="AC" Binding="{Binding AircraftCommanderSelected}"/>
</DataGrid.Columns>
</DataGrid>
背后的代码
private void dataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
foreach (Personnel p in vm.personnel)//Loop through each item in the collection
{
//per.ID is the ID of the person who was just edited.
//This sets everyones value to false except the person that was just edited.
if (p.ID != per.ID) { p.AircraftCommanderSelected = false; }
}
}
当修改集合并触发属性更改事件时,数据网格不应该更新吗?
我找到了一个解决方案,但它涉及多线程,这似乎是解决这个问题的一个不正确的方法。我也不喜欢它如何刷新整个网格并取消选择我当前的选择
dataGrid.Dispatcher.BeginInvoke(new Action(() => dataGrid.Items.Refresh()), System.Windows.Threading.DispatcherPriority.Background);
感谢任何帮助。
由于
-Justin
答案 0 :(得分:3)
您需要检查一系列事项:
ObservableCollection
中的对象是否正确实施INotifyPropertyChanged
? (不在它发布的代码中)nameof()
属性来确保这一点。Mode=TwoWay
默认情况下,大多数绑定都是OneWay
。如果您的绑定模式是一种方式,并且您更改后面的代码中的值,绑定将中断,并且在您重新加载XAML之前不再有效。
答案 1 :(得分:2)
即使您的Personnel类有has_many
事件,其声明也不表示它实现了PropertyChanged
。更改类声明,使其显示为:
INotifyPropertyChanged
此外,绑定需要双向。我不知道public class Personnel : INotifyPropertyChange {
// rest of code here
}
的默认值是什么,但明确说明它可能会有所不同。
答案 2 :(得分:1)
<DataGridCheckBoxColumn local:DataGridUtil.Name="ac" Header="AC" Binding="{Binding AircraftCommanderSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
因为您正试图从代码中更改值。