0

请看下面的代码

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-propertyVM1取决于 的IsValid-property的值VM2。实现这一目标的最佳方法是什么?

我找到了解决我的问题的方法。VM1 类订阅 VM2 的 propertychanged 事件。当 VM2 的 evr ISValid 属性发生变化时,在这个事件处理程序中,我们调用 VM1 的 setState() 方法来决定 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;
         }
     }

这是正确的方法吗?

4

2 回答 2

0

IfVM1仅有效 ifVM2也有效,请使用&&-operator 返回两个IsValid-properties 的共同结果:

public class VM1
{
    // ...

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

    // ...
}

因此,只有在(私有字段)和 return两者VM1.IsValid时才会返回。trueVM1.isValidVM2.IsValidtrue

由您决定是否VM1.IsValid返回truefalse取决于是否VMInstance返回null- 只需相应地调整语句即可。

然后 setter 只设置当前实例的值,因为它不影响IsValid第二个视图模型的 -property。

于 2013-02-12T15:03:19.357 回答
0

我需要更多关于你将如何考虑VM2'IsValid属性的信息。

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

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

    public VM1(VM2 vm2)
    {
        VMInstance = vm2;
    }

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

    }

    public VM2 VMInstance 
    { 
        get { return vmInstance; }
        set { vmInstance = value; }
    }
}

public class VM2
{
    public bool IsValid { get; set; }
}
于 2013-02-12T14:59:25.910 回答