我正在开发一个应用程序,并花了很长时间为以下问题寻找解决方案。我已经尝试了几件事,但我不确定解决它的最佳方法是什么。
我有一个视图、视图模型和模型的设置。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; }
}
}
和视图模型:
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,但我不知道如何解决所选模型更改时更新视图的问题?还是您更愿意建议使用完全不同的方法来解决这个问题?