首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展类的PropertyChanged

扩展类的PropertyChanged
EN

Stack Overflow用户
提问于 2016-08-02 01:07:14
回答 2查看 71关注 0票数 0

我的VS2015解决方案由两个项目组成: DataModel和DesktopClient。DataModel有一个Customer类-这是一个EntityFramework 6 DB实体。客户具有FirstName属性。在DesktopClient中有一个扩展类CustomerExt。在DesktopClient中,是否可以通知CustomerExt.FirstName的更改?在两个项目中定义一个部分客户是行不通的-- DataModel是首先编译的,而且它不会有在DesktopClient中定义的部分属性。

代码语言:javascript
复制
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));
    }
}
EN

回答 2

Stack Overflow用户

发布于 2016-08-02 01:39:16

让我看看我是否理解了,当您的日期在数据库中更新时,您希望更新视图?

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

某种RefreshFirstNameAsync

代码语言:javascript
复制
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();
}
票数 0
EN

Stack Overflow用户

发布于 2016-08-02 02:14:26

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

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

代码语言:javascript
复制
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实例的形式。

我记得有一些第三方库试图自动化这个过程-但我从来没有尝试过它们和/或不相信它们能正常工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38704403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档