2013-10-09 56 views
2

我對WPF比較陌生,想知道是否有人可以幫助我。WPF Datagrid更新分組後編輯/更新

我有一個collectionview,它包含一個可存儲所有項目的observablecollection列表。我的datagrid的項目源是集合視圖。我有簡單的分組數據網格XAML ...

  <DataGrid.GroupStyle> 
      <GroupStyle> 
       <GroupStyle.HeaderTemplate> 
        <DataTemplate> 
         <StackPanel> 
          <TextBlock Text="{Binding Name}" FontWeight="Bold" Padding="3"/> 
         </StackPanel> 
        </DataTemplate> 
       </GroupStyle.HeaderTemplate> 
      </GroupStyle> 
     </DataGrid.GroupStyle> 

現在...添加/刪除項目工作得很好,但是每當我更新/編輯不會更新組的項目。比方說,例如,項目按城市分組,如果我在一個城市名稱「西雅圖」下有3個項目,則將其中一個城市名稱更改爲「布魯克林」,將「布魯克林」城市保留在西雅圖組下,直到我重新填充可觀察收藏列表。

我目前的工作是...每當一個城市發生變化時,我會逐字清理並重新填充我的observablecollectionlist以供組更新...必須有更好的方法!

我的問題是,有沒有辦法更新數據網格組,手動/動態每當我更新/編輯項目?

注意 INotifyPropertyChanged的,我90%肯定是不是這裏的問題,我已經嘗試了組合的所有方式與這個接口,每當我編輯/更新項目組將不會更新。然而,每當我添加一個項目,如果它是一個新的城市,將創建一個新的組,如果我刪除了城市中的所有項目,該城市組也將被刪除。此外,它不只是具體的項目,其任何項目欄。

編輯好的,仍然沒有解決方案...但我發現了另一個工作,這再次不是最優雅的。我爲City Box設置了一個事件處理程序..所以每當城市改變時,事件處理程序被調用,並且我刷新collectionview。然而,當我添加一個項目時會調用該事件,當我點擊該項目時被調用,並且每當我進行更改時調用兩次,所以它不是每個都有效。仍然在尋找想法。

EDIT2我現在尋找到了BeginEdit和IEditableObject的EndEdit中,看看這會給我什麼,我需要

任何幫助,不勝感激,謝謝!

回答

0

好吧....我無法找到更新分組的更新我的項目的直接方式。然而,我發現了一個解決方案..我實現了一個事件,當我在文本框內,事件內部更改文本時觸發,並且在對collectionview和分組更新調用refresh()方法進行一些驗證之後。

這種解決方案我有點畏縮過,因爲調用刷新會調用該文本框更改事件爲每個文本框是該事件,通過該事件中我的驗證去刷新,只是許多不必要的調用。因此,我擁有的文本框越多,只要刷新視圖以進行簡單的文本框更改,事件就會被調用的次數就越多。

如果任何人有任何解決方案或想法,請讓我知道,因爲我將不得不與此解決方案堅持現在:(

EDIT僞代碼解決方案,如果有人想了解...

當文本框獲得焦點,設置編輯標誌是真實的,所以在文本框沒有交易可以在編輯過程中發生的。

當文本框失去焦點設置編輯標誌是假的,檢查以確保當前的文本是從以前的文本有所不同。

如果當前的文本中的當前文本是不同 刷新的CollectionView對象

+0

你介意張貼代碼的解決方案。我想知道是否可以通過將事件屬性Handled設置爲true來將通話級聯調到您的TextChanged事件。 – ouflak

+0

我認爲你需要在文本框「的GotFocus」事件我不知道一個標誌,如果這是正確的事件。但是,如果標誌爲真,則只要文本框處於焦點狀態,就不會在文本更改事件中處理任何內容。但是,一旦文本框失去焦點,你可以檢查更改或做任何事情。 –

0

我遇到了同樣的問題。得到它與ObservableCollectionImplementation,其通過分離式事件處理程序產生的項目變化工作(看here)。因此,在ViewModel中,我只是在事件處理程序中訂閱ItemPropertyChanges並強制刷新一切。

也許它仍然可以幫助別人。

問候!

public class MyViewModel: ViewModelBase 
{ 
    ObservableCollectionEx<IEditableItem> _rawsource; 
    ICollectionView _viewSource; 

    public MyViewModel (ObservableCollectionEx rawDataSource) 
    { 
    this._rawsource = rawDataSource; 
    this._rawsource.ItemPropertyChanged += new PropertyChangedEventHandler(RawSource_ItemPropertyChanged); 

    // Create the CollectionView 
    this._viewSource = new ListCollectionView(this._rawsource); 
    } 

    void RawSource_ItemPropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
    // Check if this is a Collection of EditableObjects - so a CommitEdit can be fired 
if (this._viewSource is IEditableCollectionView) 
    { 
     var so = this._viewSource as IEditableCollectionView; 
     so.CommitEdit(); 
    } 

// CollectionView refresh 
this._viewSource.Refresh(); 
    } 

    // Here is our Bindable object 
    public ICollectionView ItemSourcer 
    { 
get 
{ 
    return this._viewSource; 
} 
    } 

// ... 

}