2012-04-02 306 views
3

我有一個WPF DataGrid誰的數據源是一個ObservableCollection。它是建立鬆散的,如下:如何從WPF DataGrid中的更改更新ObservableCollection項目的屬性?

public class ItemDataCollection : ObservableCollection<ItemData> 
{ 
} 

public class ItemData : INotifyPropertyChanged 
{ 
    private bool _selected = true; 
    public bool Selected 
    { 
     get 
     { 
      return _selected; 
     } 
     set 
     { 
      if (value != _selected) 
      { 
       _selected = value; 
       NotifyPropertyChanged("Selected"); 
      } 
     } 
    } 
    } 


    _itemDataCol = new ItemDataCollection(); 
     <... fill the _itemDataCol with data here ...> 
    dataGrid1.ItemsSource = _itemDataCol; 

當收集更新,一個dataGrid1.Items.Refresh()很好地更新DataGrid1中。但是,當通過選中或取消選中與該屬性相對應的行中的複選框來修改行的「Selected」屬性時,集合中的項不會更新。我查看了ObeservableCollection的CollectionChanged事件,但看起來並沒有觸發。我需要什麼佈線才能讓dataGrid1更新集合。

更新

所有我做的是設置的ItemSource屬性設置的ObservableCollection,讓列自動生成。我已經改變了直接綁定,並找到了更多的細節問題。當我簡單地檢查框時 - 沒有通知被觸發。但是,如果在檢查框後點擊,則會更新集合。這裏是綁定:

<DataGridCheckBoxColumn Binding="{Binding Path=Selected, Mode=TwoWay}" Header="Selected"></DataGridCheckBoxColumn> 

所以我想問題是如何得到更新與檢查或取消選中框後不得不點擊?

更新#2 (我不能回答,因爲我的代表處是不夠高還) 行 - 我想我有解決方案。如果我在綁定中包含「UpdateSourceTrigger = PropertyChanged」,一切似乎都奏效。

<DataGridCheckBoxColumn Binding="{Binding Path=Selected, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Header="Selected"></DataGridCheckBoxColumn> 

請留下評論,如果有任何負面影響,我可能會失蹤。謝謝您的幫助!

回答

4

CollectionChanged用於插入和刪除。 NotifyPropertyChanged用於更新項目。在發佈的代碼中,你並沒有實際實現INotifyPropertyChanged。

public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 

我認爲這是清潔綁定到你返回_itemDataCol

否則celopez3的雙向答案

+0

對不起 - 我省略了NotifyPropertyChanged的實現來保持文章簡短。它在我的實際代碼中正確實現。 – 2012-04-02 22:09:53

+0

它會被叫嗎?集合是否被調用?請嘗試綁定到公共屬性。如果所有失敗嘗試繞過你ItemDataCollection並直接提供ObservableCollection (用於測試)。 – Paparazzi 2012-04-02 22:14:48

+0

我試過以下內容: Selected is public。問題結果是,如果在檢查或取消選中該框後點擊,則更新ObservableCollection。然而,僅僅檢查該框並不足以觸發更新。 – 2012-04-02 23:17:36

0

我不確定您是否已將足夠的信息放入您的帖子中,但我會盡力提供幫助。我的第一個問題之一是:你如何綁定到複選框?必須注意的是,如果您希望複選框影響可觀察集合,則必須對該項目設置「雙向」綁定,默認情況下該綁定爲「單向」,並且不會自動更改集合中的項目。處理這種情況的另一種方法是在複選框上添加一個事件,單擊時您將手動更改可觀察集合中的值。

+0

我只是把ItemSource屬性設置爲ObservableCollection並讓列自動生成。我已經改變了直接綁定,並找到了更多的細節問題。當我簡單地檢查框時 - 沒有通知被觸發。但是,如果在選中該框後點擊,則會更新集合。這裏是綁定: 任何想法? – 2012-04-02 23:09:51

2

ObservableCollection不聽它的項目INotifyPropertyChanged事件的公共屬性;改爲使用BindingList

換句話說,[一ObservableCollection]只有當項目被添加或刪除,而不是 當其項的值的變化,即使這些項目實施 INotifyPropertyChanged的通知。相比之下,綁定列表會監聽 INotifyPropertyChanged,因此,如果其項目被修改,則 更改將反映在網格中。結果分組,排序, 和統計功能將被更新。

http://xceed.com/CS/blogs/dontpanic/archive/2009/04/01/i-notify-we-notify-we-all-wait-no-we-don-t.aspx

0

答案是,我需要設置UpdateSourceTrigger到的PropertyChanged(見布拉姆的反應)。雙向綁定似乎不需要指定。這裏是從工作代碼的標記:

<DataGridCheckBoxColumn Binding="{Binding Path=Selected, 
    UpdateSourceTrigger=PropertyChanged}" 
    Header="Selected"></DataGridCheckBoxColumn> 
+0

我在搞這個網站 - 這個網站還是新的。當我發現它沒有選中你的時候,我重新接受了,但沒有采取。這不是我的意圖 - 你贏得了接受的答案。 – 2012-04-05 06:09:00

+0

這很奇怪,因爲它表明你今天接受和不接受。答案顯示一個複選標記,但我沒有得到信用。請嘗試單擊複選標記。如果我沒有得分,那麼沒問題。好,你有它的工作。 – Paparazzi 2012-04-05 12:49:08

+0

嗯。我試圖不接受並再次接受。它確實將您的帖子顯示爲已接受的答案 - 至少在我的瀏覽器中使用不同的機器。我的歉意 - 你是第一個發佈信譽應該是你的。這就是我得到的東西,沒有被打破... – 2012-04-05 18:01:17

相關問題