我有一个看起来像这样的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);
}
}
你的第二个建议,也是每个对象的虚拟机是我最终使用之前,你建议它的解决方案。在虚拟机中有一个属性来包装数据对象中的每个属性似乎有点多余,但它似乎是最好的(或最不好的)方法。 –