gpt4 book ai didi

c# - 当我的设置也更改时,如何更改MVVM属性?

转载 作者:行者123 更新时间:2023-12-03 10:52:44 25 4
gpt4 key购买 nike

我有一个这样的ViewModel

Public class AboutPageViewModel
{
public AboutPageViewModel()
{
AppName = Settings.MyAppName;
}

private string _appName;
public string AppName
{
get{return _appName;}
set{_appName = value; RaisePropertyChanged("AppName");}
}
}

现在在静态类中
public static class Settings
{
public static string MyAppName{get;set;} = "LOL"
}

每当MyAppName更改时,如何通知ViewModel并将其更新到Binded UI?

谢谢!

最佳答案

正如您在问题中定义的那样,Settings不是静态类(啊,我在注释中看到这是一个错字,并且在您的代码中是静态的)。它不应该是静态的。从理论上讲,可以在静态类上进行PropertyChanged通知,但这并不值得您费时间,也不必费心。

像您的viewmodel一样,让Settings实现INotifyPropertyChanged。当MyAppName更改时,Settings应该提高PropertyChanged,就像AboutPageViewModel在其自己的AppName属性更改时一样。

现在给Settings一个静态属性Instance:

public static Settings Instance { get; private set; }

static Settings()
{
Instance = new Settings();
}

并在 PropertyChanged中处理其 AboutPageViewModel事件:
public AboutPageViewModel()
{
AppName = Settings.Instance.MyAppName;
Settings.Instance.PropertyChanged += (s,e) =>
{
// If you're in C#6:
//if (e.PropertyName == nameof(Settings.MyAppName))
if (e.PropertyName == "MyAppName")
{
AppName = Settings.Instance.MyAppName;
}
}
}

选项二

可以说是更好的选择;我已经这样做了不止一次。

在注释中,@ MikeEason很好地指出,也可以通过自定义 *Changed事件(例如 MyAppNameChanged)来完成此操作,它具有两个优点:它使您可以返回静态类,并且可以跳过对属性的检查名称,这是额外的代码,也是 "magic string"。使用 INotifyPropertyChanged,我们对魔术字符串的危险有些 NumPy ,但实际上它们是不好的。如果您使用的是C#6,则可以并且绝对应该使用 nameof()运算符,但并不是所有人都还使用C#6。我工作的主要责任是希望在今年夏天迁移到C#6的应用程序。
public static event EventHandler<String> MyAppNameChanged;

private static String _myAppName = "";
public static String MyAppName {
get { return _myAppName; }
set {
if (_myAppName != value)
{
_myAppName = value;
// C#6 again. Note (thanks OP!) you can't pass this for sender
// in a static property.
MyAppNameChanged?.Invoke(null, value);
}
}
}

这样做的缺点是,此类称为 Settings,而不是 Setting。也许到处都是十几处属性的变化。那将成为不同属性更改事件的真实掩盖(您可能会问“那又是什么?”,您可能有一点意思)。我的趋势是坚持使用 PropertyChanged(如果有一大堆),如果类仅具有一个或两个需要有人关注的重要属性,则添加一个事件。我认为这两种方式都令人讨厌。两者都尝试,最终您会喜欢上一种偏好。

关于c# - 当我的设置也更改时,如何更改MVVM属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37726433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com