0

我正在尝试解决在 WPF 中实现 MVVM 时遇到的问题。我Contact下面的课程是由实体框架填充的模型。

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 的数据源设置为 的实例ContactViewModel,并将两个 TextBox 绑定到MyContact.FirstNameMyContact.LastName。我将 a 绑定TextBlockFullName. 当我更改任何一个文本框时,全名TextBlock都不会更新(显然,我没有在任何地方做OnPropertyChanged("FullName")任何事情)。

问题是,我在哪里添加OnPropertyChanged("FullName")我不一定要修改我的模型,因为它正在其他地方使用,我不想将它绑定到我的 ViewModel。

我需要重新考虑我的架构吗?

4

2 回答 2

3

我需要重新考虑我的架构吗?

这可以通过您当前的架构来解决。您只需要将调用从您的Contact对象传播到您的 viewModel 对象。

您将需要INotifyPropertyChanged在 viewModel 中实现这一点。

这样的东西:

public class ContactViewModel : INotifyPropertyChanged
{
    //INotifyPropertyChanged implementation omitted for brevity...

    private Contact _myContact;

    public Contact MyContact 
    { 
        get
        {
            return _myContact;
        } 
        set
        {
            _myContact.PropertyChanged -= myHandler;
            _myContact = value;
            _myContact.PropertyChanged += myHandler;
        }
    }

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

    private void myHandler(Object sender, PropertyChangedEventArgs e)
    {
        OnPropertyChanged("FullName");
    }
}

我还建议看一下MVVM Foundation,因为它包含一个名为的类PropertyObserver,旨在使此类事情的连接变得更加容易。

如果您想采用 Big Daddy 建议的更多 MVVM 纯方法,则需要执行以下操作:

public class ContactViewModel : INotifyPropertyChanged
{
    // INotifyPropertyChanged implementation omitted for brevity...

    // You will require some way of setting this, either via a property
    // or the viewModel constructor...
    private Contact _myContact;

    public string FirstName
    {
        get { return _myContact.FirstName; }
        set
        {
            _myContact.FirstName = value;
            OnPropertyChanged("FirstName");
            OnPropertyChanged("FullName");
        }
    }

    public string LastName
    {
        get { return _myContact.LastName; }
        set
        {
            _myContact.LastName = value;
            OnPropertyChanged("LastName");
            OnPropertyChanged("FullName");
        }
    }

    public string FullName
    {
        get
        {
            return MyContact.FirstName + " " + MyContact.LastName;
        }
    }
}
于 2013-05-10T18:25:32.633 回答
1
Do I need to rethink my architecture?

也许...

在我看来,您将视图的属性绑定到您的视图模型 (ContactViewModel)模型 (Contact)。您的视图可以通过您的视图模型查看您的公共模型的属性等 - 我认为这不好。好像违反了Law of Demeter. 我宁愿看到您使用您的视图模型作为模型的包装器/外观。这肯定会创造更多的工作,但我认为它为您提供了更好的设计和更大的灵活性。您的视图模型将需要实现INotifyPropertyChanged此功能。

于 2013-05-10T18:56:34.080 回答