我只是开始关注MVVM,但到目前为止我看到的所有示例都将View控件绑定到简单的非WPF特定数据类型(如字符串和整数)。然而,在我们的应用程序中,我希望能够根据模型中的数字设置按钮的边框画笔。使用MVVM时,我应该在哪里放置WPF特定的代码?
此刻,我的数量转化为视图模型刷子只保留查看XAML,但是是这样吗?
我不喜欢把WPF特定代码视图模型,但同样,我不喜欢把代码隐藏我的浏览面板上的想法。
哪一个是最好的方法?
谢谢
我只是开始关注MVVM,但到目前为止我看到的所有示例都将View控件绑定到简单的非WPF特定数据类型(如字符串和整数)。然而,在我们的应用程序中,我希望能够根据模型中的数字设置按钮的边框画笔。使用MVVM时,我应该在哪里放置WPF特定的代码?
此刻,我的数量转化为视图模型刷子只保留查看XAML,但是是这样吗?
我不喜欢把WPF特定代码视图模型,但同样,我不喜欢把代码隐藏我的浏览面板上的想法。
哪一个是最好的方法?
谢谢
此刻,我将数字转换为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();
}
}
尝试自定义ValueConverter。
保持您的视图XAML的唯一目的是什么?由于可测试性和SoC,保持ViewModel清洁是有意义的。但没有代码隐藏?
我在某处读到最好尽量减少代码隐藏在视图上,以便尽量减少特定于平台的代码(还有助于单元测试)。但接下来的问题是如何避免这个WPF特定的(在我的情况下)代码污染虚拟机,因此问题。第一次为ValueConverter建议做得很好,为此我已经标记了你的答案,但是里德的答案更为详细,所以我给他打了勾。谢谢! – Surfbutler 2010-04-16 17:45:29
随着您的应用程序的增长,通常不可能将代码保留为空。像处理焦点和定制一些控件行为等问题与设计更为相关,而不是模型,因此隐藏代码对于他们来说是自然的。 – majocha 2010-04-16 18:15:54
好吧,有趣的是,我认为在使用MVVM时,我绝对不能在View中放置任何代码隐藏,但至少知道这一点,可以确信它不是必需的,甚至是可能的。再次感谢。 – Surfbutler 2010-04-16 19:19:57
想想更多,我同意你的看法。当然,像刷子这样的东西不应该暴露,因为设计师可能对如何将一个特定的状态进行可视化有不同的想法。这是一个更基本的问题:暴露WPF特定的代码通常意味着你将暴露可视化的一些细节,而不是应该可视化状态的细节。虚拟机与其视图紧密结合,但责任应该明确分开。 – 2010-04-16 17:40:26
谢谢里德,就是我在找的东西。 – Surfbutler 2010-04-16 17:46:35