私はアプリケーションに取り組んでおり、次の問題の解決策を見つけるのにかなりの時間を費やしました。私はいくつかのことを試しましたが、それを解決するための最良のアプローチが何であるかわかりません。
ビュー、ビューモデル、およびモデルのセットアップがあります。ViewModel には、ユーザーが特定のモデルを選択できるモデルのコレクションが含まれています (コレクションを空にして、選択したモデルを null にすることができます)。
ビューは、ユーザーがモデルのコレクションからモデルを選択できるコンボボックスで構成されます。選択したモデルがビューに表示されます (ツリービュー、ラベルなどのさまざまなコントロールを使用)。
これがモデルです(説明のために単純にしておきます):
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 に切り替えましたが、選択したモデルが変更されたときにビューを更新する問題を解決する方法がわかりません。それとも、これを解決するためにまったく異なるアプローチを使用することをお勧めしますか?