1

私はアプリケーションに取り組んでおり、次の問題の解決策を見つけるのにかなりの時間を費やしました。私はいくつかのことを試しましたが、それを解決するための最良のアプローチが何であるかわかりません。

ビュー、ビューモデル、およびモデルのセットアップがあります。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 に切り替えましたが、選択したモデルが変更されたときにビューを更新する問題を解決する方法がわかりません。それとも、これを解決するためにまったく異なるアプローチを使用することをお勧めしますか?

4

3 に答える 3

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;}
   }
 }

プロパティが変更された場合、ViewModel に Model オブジェクトが存在するため、アロマティックに通知されます。

于 2013-07-05T10:13:19.817 に答える
1

プロパティを次のように設定する必要があります

public void changeSelectedModel(Model newSelectedModel) 
 {
    SelectedModel.Name = newSelectedModel.Name;
    SelectedModel.Id = newSelectedModel.Id;
 }

そしてそれは通知します。

于 2013-07-05T10:35:43.780 に答える