【发布时间】:2018-05-16 01:53:53
【问题描述】:
结构
我有一个简单的表单,它会触发一个定期检查更新的计时器。在加载时启动的表单的构造函数如下所示:
public MainWindow()
{
InitializeComponent();
otherWindow = new TheOtherWindow();
if (Meta.hasUpdate)
{
updateImage.Source = new BitmapImage(new Uri("/MyProject;component/Images/updateTrue.gif", UriKind.Relative));
}
Thread updateMonitor = new Thread(() =>
{
UpdateManager updater = new UpdateManager();
updater.StartUpdateMonitor();
});
updateMonitor.IsBackground = true;
updateMonitor.Start();
}
Meta 类包含一些非常基本的信息,存储在多个地方引用但有时会更新的各种字符串。其中一个结构是:
class Meta
{
...
private static bool hasUpdate = false;
public static bool GetHasUpdate()
{
return hasUpdate;
}
public static void SetHasUpdate(bool value)
{
hasUpdate = value;
}
}
另一部分是 UpdateManager 类,其中包含一个小例程,用于每 5 分钟检查一次更新。
class UpdateManager
{
Timer timer;
public void CheckForUpdates(Object source, ElapsedEventArgs e)
{
if (!isUpToDate())
{
timer.Stop();
Meta.SetHasUpdate(true);
Application.Current.Dispatcher.Invoke(new Action(() =>
{
MessageBox.Show("A new update is now available!);
}));
}
}
public void StartUpdateMonitor()
{
float updateInterval = 300000;
timer = new Timer(updateInterval); // Milliseconds between checks.
timer.Elapsed += CheckForUpdates;
timer.AutoReset = true;
timer.Enabled = true;
}
}
问题
简而言之,我想在达到 Meta.SetHasUpdate() 时触发一个事件,然后将其广播到应用程序中的所有表单,目的是更改一个小图标以指示更新可用。
我这样做的尝试已经结束,因为我了解到实现 INotifyPropertyChanged 并不能很好地处理静态成员。这是我实现的尝试...
class Meta : INotifyPropertyChanged
{
...
private static bool hasUpdate = true;
public static bool GetHasUpdate()
{
return hasUpdate;
}
public static void SetHasUpdate(bool value)
{
hasUpdate = value;
NotifyPropertyChanged();
}
private static void NotifyPropertyChanged()
{
if (PropertyChanged != null)
{
PropertyChanged(null, new PropertyChangedEventArgs("hasUpdate"));
}
}
}
由于这些成员需要从多个表单中读回,所以我不能在不大量传递对象的情况下使它们不是静态的,我不想这样做。
在这种情况下,如何触发多个表单可以从 Meta 类接收的事件?我是否需要考虑不同的结构,还是我误解了 INotifyPropertyChanged?
【问题讨论】:
-
尝试单例 Meta,使用 Instance 获取对象,并访问其 props。他们可以使用 INotify 或 propdp`s - 如果 propdps 你可以摆脱更新程序,因为他们通过 wpf 的绑定系统将他们的更改推送给绑定到他们的人
-
静态属性更改是可行的,但它是不同的,您必须正确了解所有细节:stackoverflow.com/a/41823852/424129
标签: c# wpf events inotifypropertychanged