3 回答

TA貢獻1828條經驗 獲得超3個贊
您應該在屬性本身上實現接口。此外,在調用 PropertyChanged 事件時,您應該使用事件的本地(作用域)句柄以避免競爭條件。
public class Money : INotifyPropertyChanged {
double _currentMoney;
public event PropertyChangedEventHandler PropertyChanged;
public double CurrentMoney
{
get => _currentMoney;
set
{
_currentMoney = value;
OnPropertyChanged();
}
}
public Money() => CurrentMoney = 1000;
public int addMoney(double count) {
CurrentMoney += count;
return 1;
}
public int subMoney(double count) {
CurrentMoney -= count;
if (CurrentMoney < 0) { return 100; }
return 1;
}
public void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handle = PropertyChanged;
handle?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
編輯:為了節省一些打字時間,您還可以創建一個 ViewModelBase 類來處理較小的細節。
public abstract class ViewModelBase : INotifyPropertyChanged, IDisposable
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handle = PropertyChanged;
handle?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public virtual void Dispose() => PropertyChanged = null;
}
然后在實現 viewModel 類時,只需繼承自 base(但仍會通知屬性更改)。
public class MyClass : ViewModelBase
{
string _myField;
public string MyProperty
{
get => _myField;
set
{
_myField = value;
OnPropertyChanged();
}
}
}
注意:實際錯誤來自 [CallerMemberName] 屬性并從另一個方法中調用該方法。您可以傳入屬性名稱作為參數,也可以使用屬性本身的方法,而無需指定屬性名稱。

TA貢獻1829條經驗 獲得超13個贊
NotifyPropertyChanged 將 propertyName 作為參數。默認值為空。
private void NotifyPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); }
如果您想在 ui 上查看對“propertyName”的更改,可以使用 NotifyPropertyChanged("propertyName")。
對于您的示例,propertyName 是“CurrentMoney”
- 3 回答
- 0 關注
- 196 瀏覽
添加回答
舉報