发现用户偏好和WPF模型更改的最佳方法

时间:2018-08-21 09:14:09

标签: c# wpf mvvm inotifypropertychanged

想象一下WPF中的Patient模型,其中的一个属性是“温度”。现在,一位医生可能更喜欢摄氏温度,而另一位医生可能更喜欢华氏温度。如果温度属性需要随着医生更改首选项而在UI中发生变化,我想Patient的模型将必须订阅事件。像这样:

public Patient()
{
    Temperature.Instance.PropertyChanged += TemperatureChanged;
}
~Patient()
{
    Temperature.Instance.PropertyChanged -= TemperatureChanged;
}

但是,尽管可以正常工作,但是您可以推断,我们正在Patient模型内使用静态类进行订阅。有没有更优雅的方法?

即使Temperature类是在静态上下文中使用的,我也担心模型不会取消订阅这些事件(析构函数中只有我知道的解决方案)。并且这可能导致应用程序运行时性能下降。这种担心是真的吗?

我目前唯一的替代方法是要求在此类首选项更改时重新加载视图...

1 个答案:

答案 0 :(得分:1)

“更改首选项”与设置属性相同。例如,您可以定义一个Units属性,可以将其设置为CelsuisFahrenheit,然后为返回温度的属性引发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属性。

实现没有办法从托管事件中退订的终结器是没有意义的。