当ObservableCollection值更新时,WPF Datagrid绑定不会更新

时间:2016-02-10 14:09:16

标签: c# wpf xaml datagrid

我有一个绑定到名为“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

3 个答案:

答案 0 :(得分:3)

您需要检查一系列事项:

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

默认情况下,大多数绑定都是OneWay。如果您的绑定模式是一种方式,并且您更改后面的代码中的值,绑定将中断,并且在您重新加载XAML之前不再有效。

答案 1 :(得分:2)

即使您的Personnel类有has_many事件,其声明也不表示它实现了PropertyChanged。更改类声明,使其显示为:

INotifyPropertyChanged

此外,绑定需要双向。我不知道public class Personnel : INotifyPropertyChange { // rest of code here } 的默认值是什么,但明确说明它可能会有所不同。

答案 2 :(得分:1)

使用BindingMode.TwoWay

更新您的绑定
<DataGridCheckBoxColumn local:DataGridUtil.Name="ac" Header="AC" Binding="{Binding AircraftCommanderSelected, Mode=TwoWay,  UpdateSourceTrigger=PropertyChanged}"/>

因为您正试图从代码中更改值。