【发布时间】:2016-02-10 14:09:15
【问题描述】:
我有一个 WPF DataGrid 绑定到名为“Personnel”的 ObservableCollection。我在 DataGrid 中有一个可编辑的 DataGridCheckBoxColumn。 CheckBoxColumn 绑定到我的集合中名为“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);
感谢任何帮助。
谢谢
-贾斯汀
【问题讨论】: