2016-02-10 352 views
2

我有一個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

回答

2

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

  • 在你ObservableCollection實施INotifyPropertyChanged正確的對象? (不在其發佈的代碼中)
  • 是否有任何拼寫錯誤或大小寫屬性更改?如果您使用.NET 4.6,則可以使用新的nameof()屬性來確保這一點。
  • 如果這個值可以從後臺代碼被改變,則必須使用Mode=TwoWay

默認情況下,大多數綁定OneWay。如果您的綁定模式是單向的,並且您更改了代碼後面的值,則綁定將會中斷並且不再起作用,直到您重新加載XAML。

+0

謝謝!所有3個答案都將我引向解決方案,因爲它是一個組合,但您的問題涵蓋了大部分問題。我在我的NotifyPropertyChanged事件的字符串末尾有一個空格。修復以及將我的綁定模式更改爲TwoWay並將NotifyPropertyChanged添加到我的類聲明中解決了問題。 – Tronald

1

更新與BindingMode.TwoWay

<DataGridCheckBoxColumn local:DataGridUtil.Name="ac" Header="AC" Binding="{Binding AircraftCommanderSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 

結合,因爲你正試圖從代碼中更改值。

2

即使您的人事類別有PropertyChanged事件,其聲明並不表示它實現INotifyPropertyChanged。更改類聲明,使其顯示如下:

public class Personnel : INotifyPropertyChange { 
    // rest of code here 
} 

此外,綁定需要兩種方式。我不知道DataGridCheckBoxColumn的默認設置是什麼,但是將其明確說明並不會讓人傷心。

相關問題