将ViewModel连接到Model
本文关键字:Model 连接 ViewModel | 更新日期: 2023-09-27 18:21:13
我正在开发一个应用程序,并花了相当长的时间为以下问题找到解决方案。我试过几种方法,但我不确定解决它的最佳方法是什么
我有一个视图、视图模型和模型的设置。ViewModel包含一组模型,用户可以选择其中的特定模型(该集合可以为空,从而使所选模型为空)。
视图由一个组合框组成,该组合框允许用户从模型集合中选择一个模型。然后,所选模型将显示在视图中(带有各种控件,如树视图、标签等)
这就是模型(为了解释起见,我会保持简单):
public Model {
private int id;
private String name;
public Model(_id, _name) {
id = _id;
name = _name;
}
public int ID {
get { return id; }
set { id = value; }
}
public String Name {
get { return name; }
set { name = value; }
}
}
以及ViewModel:
public ViewModel : INotifyPropertyChanged {
private ObservableCollection<Model> models = new ObservableCollection<Model>();
private Model selectedModel;
public ViewModel() { }
public Model SelectedModel {
get { return selectedModel; }
set {
selectedModel = value;
NotifyChanged("SelectedModel");
}
}
public Model ModelCellection {
get { return models; }
set {
models = value;
NotifyChanged("ModelCellection");
}
}
public void addModel(Model newModel) {
models.Add(newModel);
}
//variant A
public int ID {
get { return (selectedModel == null) ? 0 : selectedModel.ID; }
set {
if(selectedModel == null)
return;
selectedModel.ID = value;
NotifyChanged("ID");
}
}
public String Name {
get { return (selectedModel == null) ? 0 : selectedModel.Name; }
set {
if(selectedModel == null)
return;
selectedModel.Name = value;
NotifyChanged("Name");
}
}
//variant B (the attributes of the model will be copied when the selected model changes)
public void changeSelectedModel(Model newSelectedModel) {
Name = newSelectedModel.Name;
Id = newSelectedModel.Id;
}
private int id = 0;
private String name = String.Empty;
public int ID {
get { return id; }
set {
id = value;
NotifyChanged("ID");
}
}
public String Name {
get { return name; }
set {
name = value;
NotifyChanged("Name");
}
}
}
我的问题很简单:如何通过ViewModel访问模型的相关公共属性?
到目前为止,我尝试过的解决方案是:
- 变体A:只需更改所选模型并使用代理属性来访问模型的属性(问题:当所选模型更改时,视图不会更新,因为ViewModel的Name和Id属性不会引发PropertyChanged事件)
- 变体B:当所选模型发生更改时,复制模型的相关属性(问题:我必须复制模型的属性)
在与wpf聊天中的一些人交谈后,我从变体B切换到了变体A,但我不知道如何解决在所选模型更改时更新视图的问题?还是你更愿意建议使用一种完全不同的方法来解决这个问题?
我不知道如何解决选定模型更改时更新视图的问题?
只需在SelectedModel
定义中引发PropertyChanged
事件
public Model SelectedModel {
get { return selectedModel; }
set {
selectedModel = value;
NotifyChanged("SelectedModel");
NotifyChanged("ID");
NotifyChanged("Name");
}
}
您必须在模型中实现INotifyPropertyChanged
。你的代码看起来像。
您的型号.cs
public Model:INotifyPropertyChanged
{
private int id;
private String name;
public Model(_id, _name)
{
id = _id;
name = _name;
}
public int ID {
get { return id; }
set { id = value; NotifyChanged("ID");}
}
public String Name
{
get { return name; }
set { name = value; NotifyChanged("Name");}
}
}
您的ViewModel.cs
public ViewModel
{
private ObservableCollection<Model> models = new ObservableCollection<Model>();
private Model selectedModel;
public ViewModel() { }
private Model _SelectedModel ;
public Model SelectedModel
{
get { return _SelectedModel??(_SelectedModel=new SelectedModel());}
set { _SelectedModel = value;}
}
}
如果属性已更改,它将芳香通知,因为ViewModel中存在Model对象。
您必须像一样设置属性
public void changeSelectedModel(Model newSelectedModel)
{
SelectedModel.Name = newSelectedModel.Name;
SelectedModel.Id = newSelectedModel.Id;
}
并且它将通知。