想象一下WPF中的Patient
模型,其中的一个属性是“温度”。现在,一位医生可能更喜欢摄氏温度,而另一位医生可能更喜欢华氏温度。如果温度属性需要随着医生更改首选项而在UI中发生变化,我想Patient的模型将必须订阅事件。像这样:
public Patient()
{
Temperature.Instance.PropertyChanged += TemperatureChanged;
}
~Patient()
{
Temperature.Instance.PropertyChanged -= TemperatureChanged;
}
但是,尽管可以正常工作,但是您可以推断,我们正在Patient
模型内使用静态类进行订阅。有没有更优雅的方法?
即使Temperature
类是在静态上下文中使用的,我也担心模型不会取消订阅这些事件(析构函数中只有我知道的解决方案)。并且这可能导致应用程序运行时性能下降。这种担心是真的吗?
我目前唯一的替代方法是要求在此类首选项更改时重新加载视图...
答案 0 :(得分:1)
“更改首选项”与设置属性相同。例如,您可以定义一个Units
属性,可以将其设置为Celsuis
或Fahrenheit
,然后为返回温度的属性引发PropertyChanged
事件,例如:< / p>
public class Patient : INotifyPropertyChanged
{
private Units _units;
public Units Units
{
get { return _units; }
set
{
_units = value;
NotifyPropertyChanged();
NotifyPropertyChanged(nameof(FormattedTemperature));
}
}
private double _temperature;
public double Temperature
{
get { return _temperature; }
set
{
_temperature = value;
NotifyPropertyChanged();
NotifyPropertyChanged(nameof(FormattedTemperature));
}
}
public string FormattedTemperature =>
_temperature.ToString() + (_units == Units.Celsuis ? " C" : " F");
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "") =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public enum Units
{
Celsuis,
Fahrenheit
}
在视图中,您绑定到FormattedTemperature
属性。
实现没有办法从托管事件中退订的终结器是没有意义的。