【问题标题】:Creating "lookless" views in MVVM在 MVVM 中创建“无外观”视图
【发布时间】:2011-04-25 13:17:38
【问题描述】:

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

WPF 中的自定义控件设计为“无外观”。所有逻辑都在代码中,字典中的控件模板用于将外观与控件相关联。

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

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

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

谢谢!

【问题讨论】:

  • MVVM 和自定义控件不是解决问题的竞争方法。
  • 尝试同时使用两者,您会发现两者之间可能有很多重叠。这取决于场景。
  • 我使用具有类似皮肤的控制寺庙和匹配的命名约定的整个资源字典。您所要做的就是在运行时重新链接字典以重新换肤。
  • @Cory The CodeWarrior:这非常适用于传统的 WPF 应用程序。我认为为我的 MVVM 应用程序做同样的事情会很简单,但事实并非如此。我的视图当前在 UserControls 中定义,我不知道如何重新设置 UserControl。
  • 我的视图也是 UserControls,但我重新设置了控件中的各个元素的样式,而不是整个控件。因此,TextBoxes 将具有 TextBox1 模板,Comboboxes 将具有 ComboBox1 模板等。在运行时,当我从 NormalResDict.xaml 取消链接并链接到 HighContrastDarkResDict.xaml 时,我的模板名称相同,并且所有元素都效仿。出于好奇,您的 UserControl 是如何排列的?

标签: wpf mvvm custom-controls lookless


【解决方案1】:

我个人喜欢使用 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

【讨论】:

  • 我喜欢这个主意。将其应用于创建无视视图需要一点想象力,但我认为它具有潜力。无论如何,这应该使我们能够更轻松地交换视图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 2018-05-06
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
相关资源
最近更新 更多