0

MVVM-Pattern を使用した WPF のプロジェクトがあります。

ビューには、個人 (名、姓、町) のリストビューがあり、リストの横には、ボタン (保存) が付いた個人の詳細 (名、姓、郵便番号) があります。左側の人物をクリックすると、右側の人物の詳細が自動的に読み込まれます。

ViewModel には、Person-Model の ObservableCollection があります。(人物一覧)

Person モデルには、FirstName、LastName、Town、Zip などのプロパティが含まれています。(詳細)。

ZIP を変更すると、タウンは自動的に更新されます (セッター スイッチの場合) 例: ZIP '11111' タウン 'Town1' / ZIP '22222' タウン 'Town2'。

Person モデルには、変更を保存するための ICommand "SavePerson" も含まれています。

リストビューのアイテムをクリックすると、詳細が自動的に読み込まれます。FirstName または LastName を変更して [保存] をクリックすると、リストビューで選択したアイテムの FirstName と LastName が変更されますが、問題ありません。ここで、ZIP を '12345' から '11111' に変更すると、リストビューの町はまだ古い町であり、'Town1' ではありません。

モデルに INotifyPropertyChanged-Interface を実装せずに、この問題を解決するアイデアはありますか?

いくつかのコード: モデル:

public class Person
{
    private string _firstName = string.Empty;
    private string _lastName = string.Empty;
    private string _zip = string.Empty;
    private string _town = string.Empty;

    public string FirstName
    {
        get { return _firstName; }
        set { _firstName = value; }
    }

    public string LastName
    {
        get { return _lastName; }
        set { _lastName= value; }
    }

    public string ZIP
    {
        get { return _zip; }
        set
        {
            switch (value)
            {
                case "11111":
                    this.Town = "Town1";
                    break;
                case "22222":
                    this.Ort = "Town2";
                    break;
                default:
                    break;
            }
            _zip = value;
        }
    }

    public string Town
    {
        get { return _town; }
        set { _town= value; }
    }
            public ICommand SaveNameCommand
    {
        get
        {
            return new DelegateCommand((param) => this.SaveName(param));
        }
    }

    private void SaveName(object parameter)
    {
        string[] param = ((string)parameter).Split(new char[] { ':' });
        FirstName = param[0];
        LastName = param[1];
        PLZ = param[2];
    }
}

ビューモデル:

public class PersonList
{
    private readonly ObservableCollection<Person> _persons = new ObservableCollection<Person>();
    private Person _currentSelectedPerson = new Person();

    public PersonList()
    {
        this._persons.Add(new Person() { FirstName = "First1", LastName = "Last1", Ort = "Ort1", PLZ = "112" });
        this._persons.Add(new Person() { FirstName = "First2", LastName = "Last2", Ort = "Ort2", PLZ = "122" });
        this._persons.Add(new Person() { FirstName = "First3", LastName = "Last3", Ort = "Ort3", PLZ = "1132" });
    }

    public IEnumerable<Person> Persons
    {
        get { return this._persons; }
    }
}
4

4 に答える 4

2

モデルは ViewModel から疎結合されている必要があるため、モデルに INotifyPropertyChanged を実装したくないのは理にかなっています。これは、最も一般的には WPF に関連付けられているためです。ただし、これは C# インターフェイスであり、あらゆる種類のアプリケーションで使用できるため、実装しても問題はありません。実際、それがおそらく最良の方法だと思います。ただし、モデル クラスに実装したくない場合、変更時にモデルがイベントを発生させ、ViewModel がそれをサブスクライブする、イベント サブスクライバー モデルを検討してください。

model.ValuesChanged += model_ValuesChanged;

private void model_ValuesChanged(object sender, EventArgs e)
{
     RaisePropertyChanged("MyProperty");
}
于 2013-10-31T09:32:05.617 に答える
1

モデルクラスにインターフェイスを実装したくない理由がまったくわかりませんINotifyPropertyChanged本当に、他の唯一のオプションは、それをビュー モデルに実装し、そこにすべてのモデル プロパティを公開することです。

public string FirstName
{
    get { return _currentSelectedPerson .FirstName; }
    set { _currentSelectedPerson .FirstName = value; NotifyPropertyChanged("FirstName"); }
}

public string LastName
{
    get { return _currentSelectedPerson .LastName; }
    set { _currentSelectedPerson .LastName= value; NotifyPropertyChanged("LastName"); }
}
...

WPF とINotifyPropertyChangedインターフェイスは密接に連携しています...ある段階で、それを実装する必要があります。

于 2013-10-31T09:22:04.080 に答える
0

モデルは INotifyPropertyChanged チャックINotifyPropertyChanged WPF
を実装する必要があります INotifyPropertyChanged の他の検索も同様に行います

于 2013-10-31T09:03:58.187 に答える