我正在开发一个应用程序并花了很长时间找到解决以下问题的方法。我尝试了几件事,但我不确定解决它的最佳方法是什么。
我已经设置了View,ViewModel和Model。 ViewModel包含一组模型,用户可以从中选择特定模型(该集合可以为空,这使得所选模型为null)。
View包含一个Combobox,允许用户从一组模型中选择一个模型。然后,所选模型将显示在视图中(使用各种控件,例如树视图,标签......)。
这是模型(为了便于解释,我会保持简单):
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访问模型的相关公共属性?
到目前为止我尝试过的解决方案是:
在与wpf聊天中的一些人交谈之后,我从变种B切换到变体A,但我不知道如何在所选模型更改时解决更新视图的问题?或者您是否建议使用完全不同的方法来解决这个问题?
答案 0 :(得分:4)
我不知道如何解决所选模型更改时更新视图的问题?
只需在PropertyChanged
定义中提升SelectedModel
个事件
public Model SelectedModel {
get { return selectedModel; }
set {
selectedModel = value;
NotifyChanged("SelectedModel");
NotifyChanged("ID");
NotifyChanged("Name");
}
}
答案 1 :(得分:2)
您必须在模型中实施INotifyPropertyChanged
。
你的代码看起来像。
你的Model.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;}
}
}
如果属性已更改,它将显示Notify,因为在ViewModel Model对象中存在。
答案 2 :(得分:1)
你必须设置你的属性
public void changeSelectedModel(Model newSelectedModel)
{
SelectedModel.Name = newSelectedModel.Name;
SelectedModel.Id = newSelectedModel.Id;
}
它会通知。