1

私は次のモデルを持っています:

public class Person
{
    public string LastName{get;set;}
    public City City {get;set;}
}

public class City
{
    public string Name {get;set;}
}

私は2つのビューを持っています:

  • DataGrid(AllPersonsViewModel) で LastName と都市の名前を持つすべての人を表示するための 1 つ
  • 新しい人を追加するためのもの (PersonViewModel)

私のAllPersonsViewModel:

public class AllPersonViewModel : ViewModel
{
    public ObservableCollection<PersonViewModel> PersonViewModels {get;set;}
}

私は次の PersonViewModel から始めました。

public class PersonViewModel : ViewModel
{
    private Person _person;

    public string Name
    {
        get { return _person.Name;}
        set { _person.Name = value; RaisePropertyChange("Name");}
    }

    public string CityName
    {
        get { return _person.City.Name;}
    }
}

次に、新しい Person を追加するためのプロパティを追加しました。ビューには、PersonName 用の Textbox と、City を選択するための Combobox が必要です。

public class PersonViewModel : ViewModel
{
    private Person _person;

    public string Name
    {
        get { return _person.Name;}
        set { _person.Name = value; RaisePropertyChange("Name");}
    }

    public string CityName
    {
        get { return _person.City.Name;}        
    }

    public City SelectedCity 
    { 
        get { return _person.City;}
        set { _person.City = value; RaisePropertyChange("SelectedCity");}
    }

    public ObservableCollection<City> Cities {get;set;} 
}

これは正しいアプローチですか?私には少し冗長に思えます。AllPersonsView のグリッドでは、追加のプロパティ CityName の代わりに「SelectedCity.Name」に直接バインドすることもできます。グリッドも読み取り専用です。

4

2 に答える 2

2

複数の問題があります。

1 - でビューモデルの観察可能なコレクションを宣言する必要はありませんAllPersonViewModel。の ObservableCollection を宣言するだけですPerson

CityName2 -プロパティを追加しません。あなたが述べたように必要ありません。

Name3-プロパティを追加しないでください。テキストボックスを の Name プロパティにバインドしPersonます。

于 2013-01-18T11:41:00.823 に答える
1

あなたの質問は本当に「私のモデルをビューに直接公開しても大丈夫ですか?」ということになります。いいえと言う純粋主義者もいれば、新しい機能を追加せずにモデルをラップするビューモデルを持つことは冗長だと言う人もいます。

私の意見では、目の前のタスクに依存しますが、モデルに属さない追加の状態を追加する必要があるときに、ビューモデルを「スキップ」すると戻ってきて噛まれる可能性があります。よくわからない場合は、ビュー モデルを使用しますが、たとえばリスト内の単純なモデル オブジェクトを公開する場合、ビュー モデルが提供する追加のレイヤーは必要ないことがよくあります。

あなたの場合、「純粋な」ソリューションを選択しました.モデルオブジェクトがサポートしていないためINotifyPropertyChanged、モデルプロパティが複数のソースによって変更された場合、ビューモデルを取り除くことはできません. ただし、CityNameプロパティを提供する代わりに、にバインドできますSelectedCity.Name。WPF は、データ バインディング式でのプロパティ ナビゲーションをサポートしています。

このトピックの詳細については、mvvm 公開モデルをググってください。

于 2013-01-18T12:12:53.040 に答える