我有一个 WPF DataGrid 绑定到一个名为“Personnel”的 ObservableCollection。我在 DataGrid 中有一个可编辑的 DataGridCheckBoxColumn。 CheckBoxColumn 绑定到我的集合中名为“AircraftCommanderSelected”的布尔值。当选择一行并选中复选框时,会触发一个事件来更新集合,以便每个“人员”的所有 AircraftCommanderSelected 值都设置为 false(刚刚设置为 true 的值除外)。话虽如此,我的集合正在正确更新,但我的数据网格不会“取消选中”之前选中的框,其绑定值已更改为 false。我如何通知该值已更改?下面是我的代码(为了便于阅读而进行了修改)。
Class
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);
任何帮助表示赞赏。
Thanks
-Justin