繁体   English   中英

在使用MVVM时,我应该在哪里放置WPF特定代码?

[英]Where should I put WPF specific code when using MVVM?

我刚刚开始使用MVVM,但到目前为止我看到的所有示例都是将View控件绑定到简单的非WPF特定数据类型,如字符串和整数。 但是在我们的应用程序中,我希望能够根据模型中的数字设置按钮的边框画笔。

目前,我将数字转换为ViewModel中的画笔以仅保留View XAML,但是这是正确的吗?

我不喜欢将WPF特定代码放在ViewModel中,但同样我不喜欢在我的View面板上放置代码隐藏的想法。

哪种方式最好?

谢谢

目前,我将数字转换为ViewModel中的画笔以仅保留View XAML,但是这是正确的吗?

不,不是真的。

理想情况下,您应该将WPF依赖项保留在ViewModel之外。 这有助于您的应用程序更易于测试,但也可以在将来轻松转换为Silverlight或其他技术。

但是,WPF为这种确切的场景提供了一种机制: IValueConverter 使用整数,字符串或任何其他类型转换为画笔的ValueConverter非常容易。 数据绑定概述显示了使用值转换器从颜色转换为笔刷的示例。

从长远来看,这是一个更好的设计......“画笔”和其他WPF概念实际上是视图的一部分 - 它们与你的逻辑无关。 您的ViewModel应该根据状态进行思考,并且您的View应该将该状态转换为表示状态的特定方式。

假设您要使用“红色”画笔来显示错误。 它应该暴露一些原语(即:bool属性),例如IsInErrorState ,而不是暴露一个画笔的ViewModel。 视图应该决定如何表示 - 无论是通过红色画笔,大警告等等......转换器允许这种情况以纯XAML方式发生。


在您的情况下,ValueConverter很容易。 因为你要从数字 - >刷子(虽然我建议使用自定义的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清洁是有意义的。 但没有代码隐藏?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM