PropertyChanged用于扩展类

时间:2016-08-01 17:07:14

标签: wpf mvvm

我的VS2015解决方案包含两个项目:DataModel和DesktopClient。 DataModel有一个Customer类 - 即EntityFramework 6 DB实体。客户拥有FirstName属性。 在DesktopClient中有一个扩展类CustomerExt。 在DesktopClient中,是否可以通知CustomerExt.FirstName更改?在两个项目中定义部分客户无法正常工作 - 首先编译DataModel,并且它不会在DesktopClient中定义部分属性。

public class CustomerExt : Customer, INotifyPropertyChanged
{

    public object Clone()
    {
        return this.MemberwiseClone();
    }

    private bool _isChecked;
    public bool IsChecked
    {
        get { return _isChecked; }
        set
        {
            this._isChecked = value;
            NotifyPropertyChanged("IsChecked");
        }
    }

    #region INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String info)
    {
        this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
    }
}

2 个答案:

答案 0 :(得分:0)

让我看看,如果我理解,您希望在数据库上更新日期时更新视图吗?

您必须找到一种从ViewModel请求此信息的方法。

某种RefreshFirstNameAsync

private string _firstName;
public string FirstName
{
    get { return _firstName; }
    set
    {
        this._firstName= value;
        NotifyPropertyChanged("FirstName"); // There is better ways to implement that line
    }
}

private void RefreshFirstName(){
 FirstName = _userRepo.GetFirstNameAsync();
}

答案 1 :(得分:0)

不幸的是,如果你的基类没有实现INotifyPropertyChanged,最安全的方法就是编写一个包装类,只在你的软件中使用它。您可以将其与CustExt一起使用,或者如果您想要额外的图层,则将其分开。

这也假设您可能无法控制Customer类,但您可以控制创建/编辑Customer实例的所有代码,以便您可以使用此新类,然后将其转换为仅在需要时使用原始Customer类(例如数据库事务)。

public class CustomerExt: INotifyPropertyChanged
{
    Customer _customer = new Customer();

    public object Clone()
    {
        return this.MemberwiseClone();
    }

    private bool _isChecked;
    public bool IsChecked
    {
        get { return _isChecked; }
        set
        {
            this._isChecked = value;
            NotifyPropertyChanged("IsChecked");
        }
    }

    #region WrapperProperties

    public bool FirstName
    {
        get { return _customer.FirstName; }
        set
        {
            _customer.FirstName= value;
            NotifyPropertyChanged("FirstName");
        }
    }

    #endregion

    public Customer ToCustomer()
    {
        // returning a copy of the _customer instance here is safer than returning
        // the reference, otherwise the properties could be altered directly
    }


    #region INotifyPropertyChanged

    ...
}

如果您有一个ICustomer接口并且在数据库调用期间使用它,那么其中一些变得容易一些,那么您可以跳过保留Customer实例的形式。

我记得有一些第三方图书馆试图让这个过程自动化 - 但我从来没有尝试过它们,并且/或者不相信它们能够正常工作。