2010-12-10 29 views
7

您能否想到在基於MVVM的WPF應用程序中IEditableObject仍然有用的場景?如果是這樣,你有一個例子來證明這一點。MVVM中的IEditableObject

回答

14

我在我的一個應用程序中使用了IEditableObject。例如,如果您有編輯對象的對話框,則可以在ViewModel上實現IEditableObject。當對話框打開時您可以撥打BeginEdit(),當用戶點擊確定時撥打EndEdit(),當用戶點擊取消時撥打CancelEdit()

IEditableObject只要您希望能夠回滾更改,它就是一個很好的界面。

+0

您是在每個ViewModel類中還是在原始抽象類中實現這些方法?如果原來的課程,你如何在那裏做到這一點。我正在考慮從數據庫中再次獲取模型,但模型沒有共同父類。我不確定反射方法,因爲我只編輯模型部分。 – 2011-02-20 13:41:50

+1

這取決於。如果模型具有在這些事件上運行的通用功能,那麼我只會在抽象基類中實現它。如果是這樣,你可以在那裏實現它,但是在它裏面,調用派生類需要提供的抽象方法,比如OnBeginEdit()。這樣你就可以覆蓋通用和特定的功能。 – Botz3000 2011-02-21 07:25:08

+0

我有一個ViewModel是一個對象的集合。我想用對話框來編輯選定的gridview項目。它實現了'IEditableObject',包含網格的視圖,網格綁定到的ViewModel,或者ViewModel包含一個集合的類? – 2014-06-05 12:13:50

2

DataGrid中顯示的類型中。這是必要的,因爲當我使用標籤並且DataGrid被存儲在該標籤中時,如果一個單元格處於活動狀態,則切換強制提交以在DataGrid內發言所需的標籤;自從他們沒有承諾之後回滾這些變化。 T

有一種行爲適用於DataGrid以實現此功能,但IEditableObject部分位於下方。

private IDatabaseConnection _copy; 

void IEditableObject.BeginEdit() 
{ 
    if (this._copy == null) 
     this._copy = _container.Resolve<IDatabaseConnection>(); 

    _copy.Database = this.Database; 
    _copy.DisplayName = this.DisplayName; 
    _copy.HostName = this.HostName; 
    _copy.Username = this.Username; 
    _copy.Password = this.Password; 
} 

void IEditableObject.CancelEdit() 
{ 
    this.Database = _copy.Database; 
    this.DisplayName = _copy.DisplayName; 
    this.HostName = _copy.HostName; 
    this.Username = _copy.Username; 
    this.Password = _copy.Password; 
} 

void IEditableObject.EndEdit() 
{ 
    _copy.Database = String.Empty; 
    _copy.DisplayName = String.Empty; 
    _copy.HostName = String.Empty; 
    _copy.Username = String.Empty; 
    _copy.Password = String.Empty; 
} 
2

我已經得到的IEditableObject實現我的應用程序,這樣我可以從什麼是否已經進入用戶無效更新我的數據模型保存,並回滾到原來的值,如果用戶放棄改變。