2011-07-18 56 views
1

我正在爲WPF桌面應用程序實現MVVM的項目。我有一種想要使Datagrid可編輯的情況,就像舊的MS Access表列表視圖一樣。我綁定Datagrid的ItemsSource到ObservableCollection成員實現INPC。現在,我想讓用戶通過單擊列的任何單元格來更新成員,當他們導航到其他行或Lost Focus時,應驗證數據,然後將其保存到數據庫。WPF可編輯DataGrid像MS Access和MVVM

如何在我的ViewModel中捕獲這樣的事件,以及如何實現這個簡單的功能?

回答

0

您可以通過將網格的SelectedItem綁定到您的視圖模型上的屬性來觸發「保存」操作,並且在屬性的設置器中,您可以在用新選擇的項目替換之前保存先前選擇的項目,簡短的僞代碼會是這個樣子:

public MyDataObject SelectedItem 
{ 
    get { return _selectedItem; } 
    set 
    { 
     if (value != _selectedItem) 
     { 
      SaveMyItem(_selectedItem); 
      _selectedItem = value; 
      OnPropertyChanged("SelectedItem"); 
     } 
    } 
} 

private MyDataObject _selectedItem; 
<DataGrid ItemsSource="{Binding MyCollection}" SelectedItem="{Binding SelectedItem, UpdateSourceTrigger=PropertyChanged}" ...etc... /> 

當然,你可能需要稍微調整這種方法 - 如果花費的時間顯着量以保存修改後的項目,那麼你會想要做在後臺線程上。如果您將驗證指定爲網格上列綁定的一部分,則用戶將無法選擇並編輯新行,直到數據正確驗證。

+0

希望這會起作用,只有我應該照顧的事情是,它應該保存在一些後臺線程..順便說一句我只是在尋找一些面向模式的方法,我想到了使用IEditableCollectionView:http:/ /blogs.msdn.com/b/vinsibal/archive/2008/05/20/wpf-3-5-sp1-feature-ieditablecollectionview.aspx。你對這種方法有什麼看法? –

+0

我已經嘗試在我的DTO上使用IEditObject,它的作用就像一個魅力。但仍然需要在後臺線程中保存對象。有一件事我想知道你的方法,如果用戶選擇一行而他們沒有選擇另一行,他只需從頁面導航即可。它會調用所選屬性的setter嗎? –

+0

@Shoaib - 是的,只要您在SelectedItem綁定中包含'UpdateSourceTrigger = PropertyChanged',setter將在他們選擇新行時被調用。 – slugster

0

我會使用Linq到Sql並將datagrid ItemsSource直接綁定到你想要的表。這將處理所有的變化跟蹤,並且當你簡單地調用SubmitChanges(你可以在selectedItem改變時你可以做,參見slugster的答案)的時候也會保存到數據庫中。

+0

與LinqToSQL它應該可以正常工作,但我不能使用LINQ到SQL,因爲我已經使用LLBLGen專業版作爲DAL。甚至我也無法將LLBLGen實體傳遞給我的視圖,因爲它會將圖層緊密結合在一起。我想要一些可以與POCO合作的方式。 –