2017-04-24 39 views
0

我正在使用MVVM模式製作頁面。命令參數引用MVVM模式中的視圖控件是否正確?

順便說一下,我在執行命令時遇到了一個問題。 這是'發送命令參數到UI控制'的權利嗎?

例如,我有一個TextBox控件。當LostFocus事件被觸發時,會引發一個綁定到TextBox的驗證命令,我將發送一個UI控件作爲命令參數來顯示驗證失敗消息。

執行命令後,如果驗證失敗,我將更改UI控件的內容值。

這些是我的情況。

但我知道一個viewmodel不應該直接引用任何視圖及其控件。

請讓我知道如何。

+0

對於驗證,您可以使用「IDataErrorInfo」或「INotifyDataErrorInfo」接口。這些intefaces與MVVM patten很好地協作。請看看這個教程大約相同:https://www.tutorialspoint.com/mvvm/mvvm_validations.htm –

+0

你可以看看我的問題,可能會幫助你:http://stackoverflow.com/問題/ 42931775/is-mvvm-pattern-broken – Rekshino

回答

1

如果您的驗證是在您的視圖/控件背後的代碼中評估的,那麼您可以發送或傳遞控件。

我不得不質疑在UI層做了什麼樣的驗證 - 它可以是通用輸入邏輯(像數字或只是某些字母等),但它不應該涉及任何業務邏輯。你的代碼在後面可以在視圖模型上調用一個方法來執行基於業務邏輯的驗證,但它應該避免傳遞一個控件。

如果你只是在尋找一種方法,使多個控件的通用驗證方法,那麼你應該考慮另一種方式,如:

  • 創建使用具有驗證
  • 自定義用戶控件附加的行爲
+0

感謝您的親切回答。 –

1

視圖模型不應該對任何UI控件(如TextBox)有任何引用或任何依賴關係。

不是傳遞到TextBox參考作爲命令參數的視圖模型命令的,你應該要麼通過TextBoxText屬性的值作爲string參數或 - 甚至更好 - 你應該簡單地結合TextTextBox的屬性視圖模型的string源屬性:

<TextBox Text="{Binding YourViewModelProperty}" /> 

TextBox失去焦點,你可以很容易地脫掉你的驗證邏輯在二傳手的源屬性將被設置:

private string _s; 
public string YourViewModelProperty 
{ 
    get { return _s; } 
    set { _s = value; Validate(); } 
} 

這就是MVVM模式應該如何實現的。

+0

謝謝你的回答。 –

相關問題