作为WPF的新手,我最近开始了我的MVVM旅行。我可以理解为什么我们需要MVVM的原始内涵,但是一些实现细节仍然让我很困惑。
以下是我的一个问题:
如何通过model
View
中的媒体资源导出到ViewModel
我可以在这里展示我的一些想法,所以请与我分享您的观点。
以下是我的实施之一:
class MyModel : INotifyPropertyChanged
{
private String _name;
public String Name
{
get { return _name; }
set
{
if (_name != value)
{
_name = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Name"));
}
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
class MyViewModel
{
private MyModel _model;
public MyModel Model
{
get { return _model; }
set { _model = value; }
}
}
我认为问题在于我们不会将视图与模型分离。并且视图需要知道有关模型实现的每个细节以完成绑定过程。在Model
直接中导出属性以从ViewModel
查看,在我看来不能被视为一个好的设计。
所以我希望你能分享一下你对这个主题的设计经验。
顺便说一句,
如果我们从viewmodel导出许多对象(例如List
MyModel
个对象,那么我如何实现它以将视图与模型分离?
答案 0 :(得分:4)
不是您的模型,但您的ViewModel应实现INotifyPropertyChanged。然后,您可以在视图中使用Binding从ViewModel获取数据。
在您的View / XAML中,您有
之类的陈述... Content="{Binding myViewModelProperty}" ...
取决于你的约束力。
myViewModelProperty必须是ViewModel中的公共属性
public string myViewModelProperty { get; set; }
不要忘记在setter中调用RaiseNotifyPropertyChanged(或调用你的处理程序)来获取View中的更新。
private string myViewModelField;
public string myViewModelProperty
{
get
{
return myViewModelField;
}
set
{
myViewModelField = value;
RaiseNotifyPropertyChanged(() => myViewModelProperty);
}
}
**更新**
列表通常通过ObservableCollection<Type>
“导出”。
理想情况下,Type
是一些ViewModel,使用模型中的数据创建
显示在您的视图中。您可以将ViewModel想象为Adapter
之间
你的模特和你的观点。
答案 1 :(得分:1)
这不是一个严格的规则,但在我的情况下,我更喜欢在ViewModel中实现INotifyPropertyChanged并将模型保留为简单的POCO。
在ViewModel中“重复”模型的属性可能很烦人,但是:
所以在你的例子中它将是:
class MyModel
{
public String Name
{
get;
set;
}
}
class MyViewModel : ViewModelBase //let's say you have this base class in your framework
{
private MyModel model;
public MyViewModel(MyModel model)
{
this.model = model;
}
public string Name
{
get
{
return this.model.Name;
}
set
{
if(IsValidInput(value)
{
this.model.Name = value;
this.RaisePropertyChanged("Name"); // the ViewModelBase base class provide this helper.
}
}
}
}
关于第二个问题,ObservableCollection通常是向视图公开模型集合的好方法:
class ContactListViewModel
{
public ObservableCollection<MyModel> Contacts { get; private set;}
}
答案 2 :(得分:0)
您只需在视图wiuth Model.Name
上绑定您的属性即可