當你在你的問題中定義它,Settings
不是一個靜態類(啊,我看到在評論中是一個錯字,而且它是靜態的在你的代碼中)。它不應該是靜態的。 PropertyChanged靜態類上的通知在理論上是可行的,但這不值得你花時間去處理,而且沒有必要打擾。
有Settings
實現INotifyPropertyChanged
,就像你的viewmodel。當MyAppName
發生變化時,Settings
應該提高PropertyChanged
,就像AboutPageViewModel
確實在自己的AppName
屬性發生變化時一樣。
現在給Settings
靜態屬性稱爲Instance
:
public static Settings Instance { get; private set; }
static Settings()
{
Instance = new Settings();
}
而且在AboutPageViewModel
處理其PropertyChanged
事件:
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
一起工作,我們對魔術串的危險有點麻木,但實際上它們很糟糕。如果您使用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
,如果其中有一整套,並且如果課程只有一兩個重要的特性需要人們關注,那就添加一個事件。無論哪種方式在我看來令人討厭;嘗試兩種,你最終會選擇一個偏好。
也許'MyAppNameChanged'專用**事件**可能是一個更好的主意?這將允許您防止檢查PropertyChanged上的屬性名稱。 –
感謝您的回答。設置是一個靜態類。我忘了添加這個。 –
^一個事件也可以在靜態類上工作。 –