2011-08-18 74 views
2

我有一個看起來像這樣的ViewModel類。將Caliburn.Micro中的警衛屬性綁定到視圖模型中的對象上的屬性

class MyViewModel : Screen 
{ 
    public BindableCollection<MyObject> MyObjects { get; set; } 

    private MyObject selectedObject; 
    public MyObject SelectedMyObject 
    { 
    get { return selectedObject; } 
    set 
    { 
     selectedObject = value: 
     //some additional unrelated logic 
    } 
    } 

    public void SaveObject() 
    { 
    //some logic 
    } 
    public bool CanSaveObject{ 
    get{ 
     //logic to determine if the selectedObject is valid 
    } 
    } 

這是相關的代碼。現在的問題。

MyObject是一個有三個屬性的類。在視圖中,我有一個綁定到MyObjects集合的ListView,以及綁定到ListView中的SelectedItem的三個文本框。

當我填寫文本框時,相關對象在模型中被更改,但我想確保該對象在保存之前處於有效狀態。 CanSaveObject有必要的邏輯,但問題是永遠不會被調用,因爲我沒有任何oppurtunity調用NotifyOfPropertyChanged時填充文本框,因爲只有selectedObject的屬性被調用,並沒有MyViewModel屬性。

所以問題是:是否有任何好的方法來做到這一點,而無需在ViewModel上封裝MyObject中的屬性。

如果我製作像這樣的屬性,然後在視圖中直接綁定這些而不是SelectedItem,但是如果像這樣的黑客是這樣做的唯一方法,視圖模型就會變得混亂起來。我希望它不是:)

public string SelectedObjectPropertyOne{ 
    get{ return selectedObject.PropertyOne; } 
    set{ 
    selectedObject.PropertyOne = value; 
    NotifyOfPropertyChange(() => SelectedObjectPropertyOne); 
    NotifyOfPropertyChange(() => CanSaveObject); 
    } 
} 

回答

2

ActionMessage.EnforceGuardsDuringInvocation是一個靜態布爾字段,可設置爲強制保護檢查時的動作將被調用。這樣可以防止調用實際的Save動作,但是在更新選定模型之後立即根據警戒狀態發出UI外觀問題。

沒有這樣做,我建議的唯一其他修改是爲MyObject模型創建一個VM類型,並將驗證和保存邏輯移到那裏。這也可以讓你簡化你的視圖...

+0

你的第二個建議,也是每個對象的虛擬機是我最終使用之前,你建議它的解決方案。在虛擬機中有一個屬性來包裝數據對象中的每個屬性似乎有點多餘,但它似乎是最好的(或最不好的)方法。 –

相關問題