2010-04-16 73 views
7

我只是開始關注MVVM,但到目前爲止我看到的所有示例都將View控件綁定到簡單的非WPF特定數據類型(如字符串和整數)。然而,在我們的應用程序中,我希望能夠根據模型中的數字設置按鈕的邊框畫筆。使用MVVM時,我應該在哪裏放置WPF特定的代碼?

此刻,我的數量轉化爲視圖模型刷子只保留查看XAML,但是是這樣嗎?

我不喜歡把WPF特定代碼視圖模型,但同樣,我不喜歡把代碼隱藏我的瀏覽面板上的想法。

哪一個是最好的方法?

謝謝

回答

7

此刻,我將數字轉換爲ViewModel中的畫筆以僅保留View XAML,但是是嗎?

不,不是真的。

理想情況下,你應該保持WPF依賴性您的視圖模型的。這有助於您的應用程序更易於測試,但也可以在未來輕鬆轉換爲Silverlight或其他技術。

WPF提供了這個確切情況的機制,但是:IValueConverter。使用ValueConverter可以很容易地將整數,字符串或任何其他類型的內容轉換爲筆刷。 Data Binding Overview顯示了使用值轉換器從顏色轉換爲畫筆的示例。

這是從長遠來看,一個更好的設計......「刷」等WPF概念都認爲,真正的部分 - 它們不依賴於你的邏輯。你的ViewModel應該考慮狀態,你的視圖應該將該狀態轉換爲表示狀態的特定方式。

假設您想使用「紅色」筆刷來顯示錯誤。而不是ViewModel公開一個畫筆,它應該暴露一些原始的(即:一個布爾屬性),如IsInErrorState。視圖應該決定如何表示 - 無論是通過紅色刷子,大警告等等......轉換器允許以純粹的XAML方式進行。


在你的情況下,ValueConverter很容易。既然你要從一個Number - > Brush(儘管我推薦使用一個自定義Enum而不是int),你可以這樣做:

[ValueConversion(typeof(int), typeof(SolidColorBrush))] 
public class IntToBrushConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     int option = (int)value; 
     switch(option) 
     { 
      default: 
       return Brushes.Black; 
      case 1: 
       return Brushes.Red; 
      case 2: 
       return Brushes.Green; 
      // ... 
     } 

    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     // No need to convert back in this case 
     throw new NotImplementedException(); 
    } 
} 
+0

想想更多,我同意你的看法。當然,像刷子這樣的東西不應該暴露,因爲設計師可能對如何將一個特定的狀態進行可視化有不同的想法。這是一個更基本的問題:暴露WPF特定的代碼通常意味着你將暴露可視化的一些細節,而不是應該可視化狀態的細節。虛擬機與其視圖緊密結合,但責任應該明確分開。 – 2010-04-16 17:40:26

+0

謝謝里德,就是我在找的東西。 – Surfbutler 2010-04-16 17:46:35

2

嘗試自定義ValueConverter。

保持您的視圖XAML的唯一目的是什麼?由於可測試性和SoC,保持ViewModel清潔是有意義的。但沒有代碼隱藏?

+0

我在某處讀到最好儘量減少代碼隱藏在視圖上,以便儘量減少特定於平臺的代碼(還有助於單元測試)。但接下來的問題是如何避免這個WPF特定的(在我的情況下)代碼污染虛擬機,因此問題。第一次爲ValueConverter建議做得很好,爲此我已經標記了你的答案,但是裏德的答案更爲詳細,所以我給他打了勾。謝謝! – Surfbutler 2010-04-16 17:45:29

+2

隨着您的應用程序的增長,通常不可能將代碼保留爲空。像處理焦點和定製一些控件行爲等問題與設計更爲相關,而不是模型,因此隱藏代碼對於他們來說是自然的。 – majocha 2010-04-16 18:15:54

+0

好吧,有趣的是,我認爲在使用MVVM時,我絕對不能在View中放置任何代碼隱藏,但至少知道這一點,可以確信它不是必需的,甚至是可能的。再次感謝。 – Surfbutler 2010-04-16 19:19:57

相關問題