2017-08-03 62 views
0

我目前正在与MVVM一起工作,因为对模型的更改要求在WPF中触发INotifyPropertyChangedOnPropertyChanged。我寻求简短而好的解决方案。我的研究表明,自动财产不能自行触发OnPropertyChanged。因此我需要为每个Property添加其他字段。 我目前是ChangeProperty-了Methode在我的抽象类,这有助于我很多:MVVM公共财产的做法

public abstract class PropertyExtension : INotifyPropertyChanged 
{ 
    protected void ChangeProperty<T>(T value, ref T field, [CallerMemberName] string property = "") 
     { 
      if ((value!= null) && (!value.Equals(field))) 
      { 
       field = value; 
      } 
      if (property != "") 
      { 
       this.OnPropertyChanged(property); 
      } 

     } 
... 
} 

到目前为止,这工作挺好的,它为我节省了很多时间。但是我仍然不能在自动属性中使用它。因此字段仍然是必需的:

private int _ItemNumber; 
    public int ItemNumber 
    { 
     get { return _ItemNumber; } 
     set { ChangeProperty(value, ref _ItemNumber); } 
    } 

所以重点是:当我改变属性的类型时,我也必须改变字段。我的想法是将该字段更改为动态:

private dynamic _ItemNumber; 
    public int ItemNumber 
    { 
     get { return _ItemNumber; } 
     set { ChangeProperty(value, ref _ItemNumber); } 
    } 

这是工作到目前为止,我找不到任何错误。我的问题是:这是一个好习惯吗?我错过了什么吗?动态事件是一个很好的选择吗?它会影响性能吗?会影响内存使用情况吗? 我的目标是拥有一个易于维护的代码,例如只有部分类只包含所有private dynamic字段以保持实际模型清洁。任何反馈都是需要的。

+0

要回答你的问题,使用私人领域的动态是好的,没有错。它不应该在您的应用程序中大大影响性能。通过部分类将字段放入单独的文件中可能会隐藏它们实际存在的事实,并且稍后在您回过头来维护您的项目时会让您感到困惑。我不会那样做。正如Piotr回答,如果你想为你的模型/视图模型简化代码,那么像Fody这样的框架可以为你提供。 –

回答

2

我建议使用开始:PropertyChanged.Fody :)

https://github.com/Fody/PropertyChanged

这样一来,你的代码是干净整洁 - 因为它假设是:)

你的理论模型MVVM将是:

public class ViewModel 
    { 
     public int ItemNumber { get; set; } 
    } 

让PropertyChanged.Fody为你休息。