2013-02-12 34 views
0

請看看下面的代碼二傳手是取決於所含ViewModel類的其他財產

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 
    { 
     // ... 
    } 
} 

現在的VM1IsValid - 屬性取決於IsValid的價值 - 性質VM2。什麼是實現這一目標的最佳方式?

我找到了解決我的問題的方法。 VM1類訂閱VM2的propertychanged事件。我們調用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; 
     } 
    } 

這是正確的方法嗎?

+0

當你說「VM1依賴於VM2的IsValid屬性值」時,你的意思是類似'return isValid && vmInstance!= null && vmInstance.IsValid;'? – Clemens 2013-02-12 14:58:03

+0

你有沒有想過在VM1中公開你的VM2 IsValid屬性,只是創建一個getter:'public bool IsValid {get return vmInstance.IsValid; }' – 2013-02-12 14:58:03

+0

其實VM2的IsValid屬性依賴於VM2的各種其他屬性。並且VM1的IsValid屬性依賴於VM1的另外兩個屬性(比如Prop1,Prop2)以及VM2的IsValid屬性的值。只有當Prop1(類型爲字符串)不爲空且Prop2(類型爲int)大於18且VM2的IsValid屬性爲true時,VM1的ISValid屬性才爲true。 – 2013-02-13 05:43:12

回答

0

我需要更多關於你如何去考慮VM2IsValid屬性的信息。

您可以先將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; } 
} 
+0

不要忘記檢查'null'的'VMInstance'。 – Clemens 2013-02-12 15:00:45

0

如果VM1纔有效,如果VM2是有效的,也使用&& - 運算符返回兩個IsValid -Properties的共同結果:

public class VM1 
{ 
    // ... 

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

    // ... 
} 

因此VM1.IsValid將僅在兩臺VM1.isValid返回true (私人領域)和 VM2.IsValid返回true

它是由你來決定是否VM1.IsValid返回根據VMInstance是否null與否truefalse - 只要調整相應的聲明。

然後設置者僅設置當前實例的值,因爲它不會影響第二個視圖模型的IsValid-屬性。

+1

不要忘記檢查'VMInstance'爲null。 – Clemens 2013-02-12 15:08:10

+0

@Clemens你是對的 - 謝謝你指出。 – Spontifixus 2013-02-12 15:11:15

+0

你可能會放棄所有'this.'東西,因爲它是多餘的。 – Clemens 2013-02-12 15:17:43