在MVVM中创建“无视”视图

时间:2011-04-25 13:17:39

标签: wpf mvvm custom-controls lookless

我们希望创建一个可以快速轻松地“重新设置皮肤”的应用程序,并尽可能提高灵活性。通常,这是通过在资源字典中交换模板和样式来实现的。

WPF中的自定义控件旨在“看起来很”。所有逻辑都在代码中,字典中的控件模板用于将外观与控件相关联。

MVVM和自定义控件之间存在很多重叠。许多开发人员说MVVM胜过自定义控件。两者都可以被视为将逻辑移出视图并进入另一个代码文件的方法。我认为如果VM包含域相关逻辑,而自定义控件包含特定于视图的逻辑,则两者之间可能存在语义差异。

将相关视图XAML移动到可以换出的资源字典中的最佳方法是什么?我应该在字典中使用直接数据模板(不是我喜欢的方法,因为视图很复杂)?我应该创建一个自定义控件来替换视图并为其定义控件模板(导致控件和VM之间的代码重复)?我应该将UserControl用于视图并隔离这些控件的XAML,以便可以将这些文件与资源字典交换出来吗?

你会如何处理这个问题?有什么建议?

谢谢!

1 个答案:

答案 0 :(得分:2)

我个人喜欢使用 using an IValueConverter like this post.

这基本上要求你:

  • 在您的应用程序资源中放入一个条目,要求WPF使用值转换器
  • 使用您想要的自定义逻辑实现IValueConverter

这为您提供了您认为应用程序所需的灵活性。上面的帖子使用约定优于配置查找策略,但您可以轻松地将其交换为依赖于您可以注册/解析对象的服务的转换器,如下所示:

public static class ServiceProvider
{
  public void Register<TView>(Type ViewModelType);
  public void Register(IDictionary<Type,Type> ViewLookup);
  public object Resolve(object ViewModel);
}

HTH