使用INotifyPropertyChanged和类似WinForms的事件处理程序相比,有什么优势?

时间:2019-01-09 14:51:33

标签: c# wpf data-binding entity-framework-6

我正在使用WPF重新编码WinForms应用(MySQL / EF6,其中有许多要更新的字段)。我正在检查为每个字段支持INotifyPropertyChanged所需的代码,并想知道这是否比事件处理背后的经典代码更具优势。

我用C#开发了一个健壮的WinForms应用程序,它支持相当复杂的数据模型,包括EF6 / MySQL。可以想象,在许多文本字段,组合框,NumUpDowns等中,所有不同字段都有许多事件处理程序。在将代码库移至WPF及其本机数据绑定的过程中,我反复阅读了有关重新编码中级数据对象以支持类中每个字段的setter上的INotifyPropertyChanged的需求。

我已经编码了屏幕设置方法和Winforms事件处理程序,它们在类和控件之间执行双向更新功能。当然,这些将需要进行一些修改以适应WPF控制方法和属性。我试图确定是否值得在与屏幕交互的每个单独字段上设置INotifyPropertyChanged所需的编码工作和持续的维护,还是仅修改事件处理程序背后的更经典代码。我有50到100个字段(各种类型),每个字段都需要进行双向绑定的特殊编码。

这值得吗,还是我缺少WPF新手吗?

在现有数据维护类中,我有很多采用这种形式的字段:

public class clsLot
{
    // Code omitted for general error codes, enums etc.


    // Here are a long list of fields which are generated by EF6 model, decorated with straightforward {get; set; }
    public long idLot { get; set; }
    public string LotID { get; set; }
    public Nullable<long> idRecipe { get; set; }
    public string PlantOrder { get; set; }
    public Nullable<System.DateTime> CreateDate { get; set; }
    public string Inspector { get; set; }
    public string LotType { get; set; }
    [... Long list omitted.  For ease of maintenance when new fields are added to the database and ef6 model regened, this list is copied from ef6 gened code

            // maintenance methods omitted for mapping between this class and database (save, update etc.
    }

当我看到WPF双向绑定的示例时,他们说该类必须支持INotifyPropertyChanged,并且每个字段都必须转换 从更简单的“公共字符串LotID {get; set;}”到每个字段这样的

public class User : INotifyPropertyChanged
{
    // Begin modification for each field in the class that needs to be bi-directionally mapped
    private string _LotID;
    public string LotID 
    {
        get { return this._LotID; }
        set
        {
            if(this.name != value)
            {
                this._LotID = value;
                this.NotifyPropertyChanged("LotID");
            }
        }
    }
    // End of modification for each field

    public event PropertyChangedEventHandler PropertyChanged;

    public void NotifyPropertyChanged(string propName)
    {
        if(this.PropertyChanged != null)
        this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }
}

我将公共事件和NotifyPropertyChanged方法添加到现有类没有问题。 我的问题是代码行中的13倍扩展以支持每个字段的INotifyPropertyChanged 我有50-100个字段(不能再从创建的自动生成的类中复制/粘贴) 通过Ef6模型)。

与仅移动和调整Winforms应用程序中现有的屏幕设置以及控制事件处理程序方法相比,这是否值得?

问题的核心是我正在使用利用“公共字符串LotID {get; set;}”语法的自动生成的代码,这需要分解为单独的私有字段和每个属性的公共属性当前自动生成的字段/属性。

1 个答案:

答案 0 :(得分:0)

首先,您可以使用VS的“查找和替换”功能以及一些巧妙的正则表达式来完成这项工作。

首先,您忘记了可以删除所有事件处理程序,因此总的来说,有些行是新的,而有些行将被删除。

从维护的角度来看,绑定和INPC对人类而言更具可读性,并且使解决诸如“为什么此控件不显示当前值?”之类的问题更加容易。

您还可以使用事件处理程序来编辑使这些属性进行双向同步的所有代码吗?

使用绑定时,xaml端只是Text="{Binding SomeStringProperty}"并且有效。

**编辑**

主要优点是您可以使用WPF设计的MVVM模式。正确的做法使维护应用程序变得容易得多,但在许多情况下更加乏味。