我正在使用这种方法来设置和获取属性:
bool _selectEnabled;
public bool SelectEnabled
{
get => _selectEnabled;
set => SetProperty(ref _selectEnabled, value);
}
和:
protected virtual bool SetProperty<T>(
ref T backingStore, T value,
[CallerMemberName]string propertyName = "",
Action onChanged = null)
{
if (EqualityComparer<T>.Default.Equals(backingStore, value))
return false;
backingStore = value;
onChanged?.Invoke();
OnPropertyChanged(propertyName);
return true;
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = "")
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
这很好用,但是有时候我需要做的不仅仅是设置和获取。例如此处:
bool _selectEnabled;
public bool SelectEnabled {
get { return _selectEnabled; }
set { if (value != _selectEnabled) {
_selectEnabled = value;
OnPropertyChanged("SelectEnabled");
// I need to call a method after the set. The methods
// will be different for each property.
myMethod("ABC", _selectEnabled);
}
}
}
我可以调用另一个方法吗?
bool _selectEnabled;
public bool SelectEnabled
{
get => _selectEnabled;
set => { SetProperty(ref _selectEnabled, value);
myMethod("ABC", _selectEnabled); }
}
我知道这种方式行不通,但是有办法吗?
谢谢
答案 0 :(得分:4)
否,arrow operator(也称为粗箭头)用于表示表达式的成员时,用于表示表达式,可以将其视为单个语句。因此,如果要执行两个语句,则不能使用它们。
只需像在c#6之前那样做:
bool _selectEnabled;
public bool SelectEnabled
{
get => _selectEnabled;
set
{
SetProperty(ref _selectEnabled, value);
myMethod("ABC", _selectEnabled);
}
}
答案 1 :(得分:1)
是的,有一种方法;但这仅仅是因为您的示例显示了一些代码,如果该属性的值已更改(即并非无条件调用),则需要调用该代码。
您显示的SetProperty
方法声明具有一个onChanged
参数,该参数是仅在值更改后才调用的Action。所以你可以这样写:
set => SetProperty(ref _selectEnabled, value,
onChanged: () => myMethod("ABC", _selectEnabled));
您可以也可以扩展该方法,以允许您以类似方式提供无条件代码;但是我会说这是一个坏主意(这是一个湿滑的斜坡)。如果您要无条件执行,请参考Camilo的答案。