2011-08-18 71 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

你的第二个建议,也是每个对象的虚拟机是我最终使用之前,你建议它的解决方案。在虚拟机中有一个属性来包装数据对象中的每个属性似乎有点多余,但它似乎是最好的(或最不好的)方法。 –

相关问题