【问题标题】:WPF MVVM Dilemma: ViewModel as Control-derivate with Style or as POCO with UserControl?WPF MVVM 困境:ViewModel 作为带有 Style 的 Control-derivate 还是作为带有 UserControl 的 POCO?
【发布时间】:2014-07-24 05:09:13
【问题描述】:

我目前正在开发我的一个新项目,该项目将成为数据记录可视化工具(用于 Pascal 中的记录)。它应该提供一种使用数据字段和指针字段定义给定记录的方法,然后会有一个示例视图,您可以在其中看到“正在运行”的记录。

现在我遇到的问题是,在这个模型中有记录和组件,它们之间的关系是一个记录有多个组件(如上所述的数据和指针)。

我想为应用程序使用 MVVM,但我现在不确定我应该如何处理这个问题。我将记录和组件建模为 RecordViewModel 和 ComponentViewModel(带有派生的 DataComponentVM、PointerComponentVM)。

现在要查看这些虚拟机,据我所知有 2 个选项:

  • 从 Control 派生 ViewModel 并提供 ControlTemplate
  • 使用 ViewModel 作为 DataContext 创建 UserControl

UserControl 方法适用于 RecordViewModel,但是当我尝试设计 ComponentViewModel 的显示方式(在 ContentPresenter 中)时,这种方法失败了,因为我需要在我的 RecordViewModel 中提供一组 UserControls(而不是 DataComponentViewModels)会让这项工作(我很确定这不是一个好主意)。

Control 方法还有一个问题,即 ViewModel 不再是 POCO,我认为这对它有一种奇怪的感觉,也不被认为是好的做法。

还有其他方法可以解决这个问题吗?在这方面,您对我还有什么好的建议吗?

提前致谢!

代码:

public class RecordViewModel : BaseViewModel
{
    public RecordViewModel()
    {
        Components = new ObservableCollection<ComponentViewModel>();
    }

    public ObservableCollection<ComponentViewModel> Components { get; set; }
}

public class DataComponentViewModel : ComponentViewModel
{
    public string Type { get; set; }
}

public class PointerComponentViewModel : ComponentViewModel
{
    public object Target { get; set; }
}

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

    天哪,我以前为什么没有想到这一点?

    我只是在考虑 ControlTemplates(因此需要我的 ViewModels 从 Control 派生)时,还有一些 DataTemplates 可以完全按照我的意愿工作。

    【讨论】:

      【解决方案2】:

      我不明白为什么你认为你需要提供一组用户控件,但听起来你真正想要的是 RecordViewModel 有一些变化:

      ObservableCollection<ComponentViewModel> Components
      

      然后在 xaml 中将组件绑定到某种 ItemsControl 的 ItemsSource 属性。 ComponentViewModel 是否需要它自己的 UserControl 取决于你想用它做什么。

      如果您没有开始点击,那么您可能需要发布一些代码,以便我们对其进行整理。

      【讨论】:

      • 提供 ComponentViewModels 集合的问题是,当我在 ItemsPresenter 的 ItemsSource 属性中绑定到此集合时,ItemsPresenter 中仅显示类型(作为字符串)。我知道我可以在 ItemsPresenter 上提供某种模板来定义子项的显示方式,然后父项定义外观,而不仅仅是组件本身(这可能只是一个风格问题)。还有其他方法可以解决这个问题吗?
      • 您可以做的最简单的事情是覆盖 ToString() 以显示对每个 ComponentVm 有意义的内容。因此,例如,如果您只需要查看 DataComponentViewModel 的 Type 属性,那么 ToString() { return Type; } 会这样做。一旦你做到了这一点,如果你需要,你可以在绑定或样式方面变得更加复杂。 WPF 框架将免费为您提供 ToString() 的一些价值(它现在显示 ViewModel 的类型只是因为这是 object.ToString() 所做的并且您没有覆盖它)
      • 是的,ToString 是一种很酷的方法,但没有提供足够的灵活性(例如让我更改给定 ComponentViewModel 的属性)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 2016-04-04
      • 2019-09-09
      • 2016-05-07
      • 2016-08-29
      • 1970-01-01
      相关资源
      最近更新 更多