WFP(MVVM)新手,这似乎是处理用户更改的典型方式:
private bool someProperty= false;
public bool SomeProperty
{
get { return someProperty; }
set
{
if (someProperty!= value)
{
someProperty= value;
OnPropertyChanged(nameof(SomeProperty));
}
}
}
对于一个大而复杂的屏幕,有很多字段需要编辑,并立即处理(单击按钮时不在最后),这将导致大量重复代码。似乎很难维护,如果您有50个或更多属性怎么办?有没有更好的方法呢?
答案 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
代码注入属性,并做一些其他更聪明的东西。