2012-04-30 66 views
3

我期待知道每次用戶編輯我的DataGrid的單元格的內容。有CellEditEnding事件,但在對集合進行任何更改之前調用DataGrid綁定的事件。WPF DataGrid CellEditEnded事件

我的datagrid綁定到ObservableCollection<Item>,其中Item是一個從WCF mex端點自動生成的類。

什麼是每次用戶提交集合更改時知道的最佳方式。

UPDATE

我試過CollectionChanged事件,結束的時候Item被修改了它不會被觸發。

回答

-1

您只需在ObservableCollectionCollectionChanged事件中添加事件處理程序。

代碼片段:

_listObsComponents.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(ListCollectionChanged); 

// ... 


    void ListCollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
     /// Work on e.Action here (can be Add, Move, Replace...) 
    } 

e.ActionReplace,這意味着你的列表的對象已經被更換。這個事件當然是在應用更改後觸發的

玩得開心!

+0

事實上,在我發佈這個問題之前,我就是這麼做的。當用戶修改集合時,CollectionChanged事件不會被觸發 –

+0

這不是您的答案,但CollectionChanged僅在以某種方式添加或刪除項目時才報告。有可能網格讓你修改一個項目而不會真正改變集合本身,所以不會觸發上述事件。 – NestorArturo

+0

Woops,是的,誤解在這裏,當一個完整的'Item'會改變時(即你放置一個新的Item()而不是前一個)''CollectionChanged'會被觸發。你需要你的'Item'類來實現'INotifyPropertyChanged',如果你想抓住每一個修改:) – Damascus

0

如果你需要知道編輯的DataGrid的項目是否屬於特定集合,你可以做在DataGrid的RowEditEnding事件是這樣的:

private void dg_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) 
    { 
     // dg is the DataGrid in the view 
     object o = dg.ItemContainerGenerator.ItemFromContainer(e.Row); 

     // myColl is the observable collection 
     if (myColl.Contains(o)) { /* item in the collection was updated! */ } 
    } 
4

您可以在屬性成員的結合使用UpdateSourceTrigger=PropertyChanged爲datagrid。這將確保當CellEditEnding被觸發時,更新已經被反映在可觀察集合中。

參見下面

<DataGrid SelectionMode="Single" 
      AutoGenerateColumns="False" 
      CanUserAddRows="False" 
      ItemsSource="{Binding Path=Items}" // This is your ObservableCollection 
      SelectedIndex="{Binding SelectedIndexStory}"> 
      <e:Interaction.Triggers> 
       <e:EventTrigger EventName="CellEditEnding"> 
       <cmd:EventToCommand PassEventArgsToCommand="True" Command="{Binding EditStoryCommand}"/> // Mvvm light relay command 
       </e:EventTrigger> 
      </e:Interaction.Triggers> 
      <DataGrid.Columns> 
        <DataGridTextColumn Header="Description" 
         Binding="{Binding Name, UpdateSourceTrigger=PropertyChanged}" /> // Name is property on the object i.e Items.Name 
      </DataGrid.Columns> 

</DataGrid> 

UpdateSourceTrigger =的PropertyChanged會立即改變屬性源只要目標屬性更改。

這將允許您捕獲對項目的編輯,因爲將事件處理程序添加到可觀察集合中。更改事件不會觸發集合中對象的編輯。

+0

謝謝你! – Richard