WPF OnPropertyChanged重复代码

时间:2016-07-22 16:44:11

标签: wpf mvvm data-binding

WFP(MVVM)新手,这似乎是处理用户更改的典型方式:

private bool someProperty= false;
    public bool SomeProperty
    {
        get { return someProperty; }
        set
        {
            if (someProperty!= value)
            {
                someProperty= value;
                OnPropertyChanged(nameof(SomeProperty));


            }
        }
    }

对于一个大而复杂的屏幕,有很多字段需要编辑,并立即处理(单击按钮时不在最后),这将导致大量重复代码。似乎很难维护,如果您有50个或更多属性怎么办?有没有更好的方法呢?

3 个答案:

答案 0 :(得分:0)

您可以使用此方法:

private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
    var handler = PropertyChanged;
    if (handler != null)
    {
        handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

在每个属性中使用它:

private bool someProperty= false;
    public bool SomeProperty
    {
        get { return someProperty; }
        set
        {
            if (someProperty!= value)
            {
                someProperty= value;
                OnPropertyChanged();
            }
        }
    }

答案 1 :(得分:0)

我为所有带有这些函数的viewmodel使用了一个基类:

protected void RaisePropertyChanged(string propertyName)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

protected bool SetValue<T>(ref T backingField, T newValue, [CallerMemberName] string propertyName = "")
{
    if (EqualityComparer<T>.Default.Equals(backingField, newValue))
    {
        return false;
    }
    backingField = newValue;
    RaisePropertyChanged(propertyName);
    return true;
}

然后您可以从任何子类中使用它:

private string _firstName;

public string FirstName
{
    get { return _firstName; }
    set { SetValue(ref _firstName, value); }
}
如果新值与前一个值不同,

SetValue将返回true,如果相同,则false将返回float:right;,以防您需要将更多操作链接到更多复杂的二传手。

答案 2 :(得分:0)

这里的救生技术是使用PropertyChanged.Fody在编译时将INotifyPropertyChanged代码注入属性,并做一些其他更聪明的东西。