gpt4 book ai didi

c# - 当 ObservableCollection 值更新时,WPF Datagrid 绑定(bind)不更新

转载 作者:行者123 更新时间:2023-11-30 20:20:49 28 4
gpt4 key购买 nike

我有一个 WPF DataGrid 绑定(bind)到一个名为“Personnel”的 ObservableCollection。我在 DataGrid 中有一个可编辑的 DataGridCheckBoxColumn。 CheckBoxColumn 绑定(bind)到我的集合中名为“AircraftCommanderSelected”的 bool 值。选择一行并选中复选框时,将触发一个事件以更新集合,以便每个“人员”的所有 AircraftCommanderSelected 值都设置为 false(除了刚设置为 true 的那个)。话虽如此,我的集合正在正确更新,但我的数据网格不会“取消选中”先前选中的框,其绑定(bind)值已更改为 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);

感谢任何帮助。

谢谢

-贾斯汀

最佳答案

有一系列的事情你需要检查:

  • ObservableCollection 中的对象是否正确实现了 INotifyPropertyChanged? (不在它发布的代码中)
  • 属性名称是否有任何拼写错误或大小写更改?如果您使用的是 .NET 4.6,则可以使用新的 nameof() 属性来确保这一点。
  • 如果可以从代码隐藏更改值,则必须使用 Mode=TwoWay

默认情况下,大多数绑定(bind)都是OneWay。如果您的绑定(bind)模式是单向的,并且您更改了隐藏代码中的值,则绑定(bind)将中断并且不再有效,直到您重新加载 XAML。

关于c# - 当 ObservableCollection 值更新时,WPF Datagrid 绑定(bind)不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35317427/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com