0

WPF での MVVM の実装に関する問題を解決しようとしています。以下のContactクラスは、Entity Framework によって設定されているモデルです。

public class Contact : INotifyPropertyChanged
{
    public string _firstName;
    public string FirstName
    {
        get
        {
            return _firstName;
        }
        set
        {
            _firstName = value;
            OnPropertyChanged("FirstName");
        }
    }

    public string _lastName;
    public string LastName
    {
        get
        {
            return _lastName;
        }
        set
        {
            _lastName = value;
            OnPropertyChanged("LastName");
        }
    }

    //INotifyPropertyChanged implementation omitted for brevity
}

ここに私のビューモデルがあります:

public class ContactViewModel
{
    public Contact MyContact { get; set; }

    public string FullName
    {
        get
        {
            return MyContact.FirstName + " " + MyContact.LastName;
        }
    }
}

そこで、View のデータソースを のインスタンスに設定し、 2 つの TextBox をとContactViewModelにバインドしています。を にバインドしています。TextBoxes のいずれかを変更しても、フルネームは更新されません (明らかに、どこにも行っていません)。MyContact.FirstNameMyContact.LastNameTextBlockFullNameTextBlockOnPropertyChanged("FullName")

問題は、どこに追加するOnPropertyChanged("FullName")かです。モデルは別の場所で使用されており、ViewModel に結び付けたくないので、必ずしもモデルを変更する必要はありません。

アーキテクチャを再考する必要がありますか?

4

2 に答える 2

1
Do I need to rethink my architecture?

多分...

ビューのプロパティをビューモデル(ContactViewModel)とモデル(Contact)にバインドしているように見えます。ビューは、ビューモデルを介してパブリックモデルのプロパティなどを見ることができます-これは良くないと思います。規約違反のようLaw of Demeterです。ビューモデルをモデルのラッパー/ファサードとして使用することをお勧めします。これにより確かに作業が増えますが、より優れたデザインと柔軟性が得られると思います。これを機能させるには、ビューモデルを実装する必要がありINotifyPropertyChangedます。

于 2013-05-10T18:56:34.080 に答える