Container ViewModel类属性的setter,它依赖于Contained ViewModel类的另一个属性

时间:2013-02-12 14:51:57

标签: c# wpf mvvm

请查看以下代码

public class VM1
{
    private bool isValid;
    private VM2 vmInstance;

    // ...

    public bool IsValid
    {
        get { return this.isValid; }
        set { /* ... */ } 
    }

    public VM2 VMInstance
    {
        // ...
    }

}
public class VM2
{
    public bool IsValid
    {
        // ...
    }
}

现在IsValid - VM1的属性取决于IsValid - VM2属性的值。实现这一目标的最佳方法是什么?

我找到了解决问题的方法。 VM1类订阅VM2的propertychanged事件。 并更改VM2的whenevr ISValid属性,在此事件处理程序中,我们调用setState() VM1的方法来决定IsValid属性的值。

    void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        switch (e.PropertyName)
        {
            case "IsValid":
                // call a method in VM1 to decide the value of IsValid property of VM1
                // say, the method name is setState()
                break;
         }
     }

这是正确的方法吗?

2 个答案:

答案 0 :(得分:0)

我需要了解有关您如何考虑VM2的{​​{1}}财产的更多信息。

您可以将IsValid的实例传递到VM2的构造函数中,以便可以引用它。请看下面的例子。

VM1

答案 1 :(得分:0)

如果VM1仅在VM2有效的情况下有效,请使用&& - 运算符返回IsValid - 属性的常见结果:

public class VM1
{
    // ...

    public bool IsValid
    {
        get
        { 
            return isValid && 
                   (VMInstance != null && VMInstance.IsValid);
        }
        set
        {
            isValid = value;
        }
    }

    // ...
}

因此VM1.IsValid只有true(私有字段)和VM1.isValid才会返回VM2.IsValid true返回VM1.IsValid

由您自行决定true是否会返回falseVMInstance,具体取决于null是否为IsValid - 只需调整声明相应

然后setter只设置当前实例的值,因为它不会影响第二个视图模型的{{1}} - 属性。