2016-08-01 76 views
0

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

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)); 
    } 
} 
+0

不是EntityFramework生成实现'INotifyPropertyChanged'的类吗? –

+0

不,由于某种原因,我没有它(DataModel不是我的构建),并且无法覆盖...也许这就是我应该检查的 –

回答

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(); 
} 
0

不幸的是,如果你的基类不执行INotifyPropertyChanged最安全的办法是只写一个包装类,只用在您的软件。您可以将它与您的CustExt匹配,或者如果您觉得您需要额外的图层,可以将它分开。

这还假定,而你可能无法控制客户类,可以控制所有的代码创建/编辑客户实例,这样就可以使用这个新类代替,然后将其转换为原始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接口,并在调用数据库所使用,那么你可以跳过保留了客户实例的手续。

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