2010-04-16 19 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

相关问题