我有一个WPF DataGrid绑定到名为“Personnel”的ObservableCollection。 DataGrid中有一个可编辑的DataGridCheckBoxColumn。 CheckBoxColumn绑定到我的集合中名为“AircraftCommanderSelected”的布尔值。选中某一行并选中该复选框后,会触发一个事件来更新集合,以便每个“人员”的所有AircraftCommanderSelected值都设置为false(除刚刚设置为true的那个值外)。这就是说,我的集合正确更新,但我的数据网格不会'取消'以前选中的框,谁的绑定值已被更改为false。我如何通知价值已更改?以下是我的代码(为便于阅读而修改)。当ObservableCollection值更新时WPF Datagrid绑定不更新
类
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更新?
我发现了一个解决方案,但它涉及多线程,这似乎是一个不正确的解决方案,这个问题。我也不喜欢它如何刷新整个网格,并取消选择我目前的选择
dataGrid.Dispatcher.BeginInvoke(new Action(() => dataGrid.Items.Refresh()), System.Windows.Threading.DispatcherPriority.Background);
任何帮助表示赞赏。
感谢
-Justin
谢谢!所有3个答案都将我引向解决方案,因为它是一个组合,但您的问题涵盖了大部分问题。我在我的NotifyPropertyChanged事件的字符串末尾有一个空格。修复以及将我的绑定模式更改为TwoWay并将NotifyPropertyChanged添加到我的类声明中解决了问题。 – Tronald