【发布时间】: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 中的用途。
【问题讨论】: