我有一個看起來像這樣的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);
}
}
你的第二個建議,也是每個對象的虛擬機是我最終使用之前,你建議它的解決方案。在虛擬機中有一個屬性來包裝數據對象中的每個屬性似乎有點多餘,但它似乎是最好的(或最不好的)方法。 –