WPF MVVM困境:ViewModel是带有Style的Control-derivate还是带有UserControl的POCO?

时间:2010-07-05 15:43:44

标签: wpf mvvm

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

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

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

现在提供这些虚拟机的外观,据我所知有两个选项:

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

UserControl方法适用于RecordViewModel但是当我尝试设计ComponentViewModel的方式时(在ContentPresenter中),这种方法失败,因为我需要在RecordViewModel中提供UserControls(而不是DataComponentViewModel)的集合会做出那样的工作(而且我很确定这不是一个好主意)。

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; }
}

2 个答案:

答案 0 :(得分:0)

我迷失了为什么你认为你需要提供一组用户控件,但听起来你真正想要的是RecordViewModel有一些变体:

ObservableCollection<ComponentViewModel> Components

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

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

答案 1 :(得分:0)

哦,上帝为什么我以前没想过这个?

我只考虑ControlTemplates(因此需要我的ViewModel从Control派生),当时还有DataTemplates,它的工作方式与我想要的完全相同。