MVVM什么时候为控件创建一个viewmodel?

时间:2013-09-23 19:45:26

标签: c# xaml mvvm

或者我应该只为正在表示的域数据创建视图模型?在阅读MVVM时,我遇到了这个:

“ViewModel负责这些任务。这个术语的意思是”视图的模型“,可以被认为是视图的抽象,但它也提供了视图可用于数据的模型的专门化 - 在后一个角色中,ViewModel包含将Model类型转换为View类型的数据转换器,它包含View可用于与Model交互的命令。“

http://blogs.msdn.com/b/johngossman/archive/2005/10/08/478683.aspx

如果viewmodel是视图的模型,那么将视图的属性放在viewmodel而不是视图本身后面的代码上是不是有意义?

我想在制作一个自定义控件时,我很难决定何时应该在控件的代码后面添加一个属性,以及何时为控件创建一个viewmodel来代表它。老实说,我觉得将所有控件的视图相关属性移动到viewmodel会清理控件后面的代码,只留下控制逻辑。

但是,如果我要改变这样的事情,那么当项目需要来自控件本身的属性时,我不能再使用{Binding ElementName = control,Path = property}而必须获取数据上下文父级(因为当前的datacontext将位于可观察集合的各个子项目上。

基本上我在考虑是否应该将类GraphViewer中的属性移动到GraphViewerViewModel然后绑定到它。

代码值一百万字所以:     公共类GraphViewerViewModel:DependencyObject       {         private const int DEFAULT_PEN_WIDTH = 2;         private const int DEFAULT_GRAPH_HEIGHT = 25;

    public SignalDataViewModel _SignalDataViewModel
    {
      get;
      set;
    }
    public PreferencesViewModel _PreferencesViewModel
    {
      get;
      set;
    }
}

同时

public class SignalDataViewModel : INotifyPropertyChanged
  {
    public event PropertyChangedEventHandler PropertyChanged;

    ObservableCollection<SignalViewModel> _signals;
    public ObservableCollection<SignalViewModel> Signals
    {
      get
      {
        return _signals;
      }
      private set
      {
        _signals = value;
      }
    }

    ObservableCollection<SignalViewModel> _AddedSignals;
    public ObservableCollection<SignalViewModel> AddedSignals
    {
      get
      {
        return _AddedSignals;
      }
      private set
      {
        _AddedSignals = value;
      }
    }
键入:

是一种痛苦
PenWidth="{Binding RelativeSource = {RelativeSource AncestorType={x:Type DaedalusGraphViewer:GraphViewer}}, 
                                  Path = _GraphViewerViewModel._SignalDataViewModel._AxisDivisionUnit.GraphPenWidth, Mode=OneWay}"

我想知道是否值得做出改变,或者我是否误解了mvvm中应该使用的视图模型。

1 个答案:

答案 0 :(得分:7)

  

我想在制作一个自定义控件时,我很难决定何时应该在控件的代码后面添加一个属性,以及何时为控件创建一个viewmodel来代表它。老实说,我觉得将所有控件的视图相关属性移动到viewmodel会清理控件后面的代码,只留下控制逻辑。

通常,自定义控件是100%查看图层代码。因此,它完全不属于MVVM。

在使用MVVM设计的应用程序中使用自定义控件时的主要目标是确保以与数据绑定完全兼容的方式设计和构建自定义控件。这将允许它在您的应用程序的View层中使用,就像其他控件一样。

因此,这几乎可以保证您将拥有代码,因为实现依赖属性确实需要代码。您还不希望在控件中设置自定义控件的DataContext(因为您要使用控件继承用户控件或窗口的数据上下文)。

  

基本上我在考虑是否应该将类GraphViewer中的属性移动到GraphViewerViewModel然后绑定到它。

如果类型特定于您的域,那么这通常更像是您的应用程序使用的UserControl。在这种情况下,创建一个ViewModel并且只是绑定可能是好的。

另一方面,如果这是一个真正的自定义控件,它是完全通用的(即:任何人都可以在任何应用程序中使用),那么将它保持为“纯视图”自定义控件通常意味着你1 )不会依赖任何ViewModel或特定于域的对象,2)不设置数据上下文(这意味着没有视图模型)。