【问题标题】:MVVM when to create a viewmodel for a control?MVVM 何时为控件创建视图模型?
【发布时间】:2013-09-23 19:45:25
【问题描述】:

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

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

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

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

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

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

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

代码值一百万字,所以: 公共类 GraphViewerViewModel :DependencyObject { 私有 const int DEFAULT_PEN_WIDTH = 2; 私有 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 中的用途。

【问题讨论】:

    标签: c# xaml mvvm


    【解决方案1】:

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

    一般来说,自定义控件是 100% 视图层代码。因此,它确实完全不属于 MVVM。

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-23
      • 1970-01-01
      相关资源
      最近更新 更多