如何通知所有窗口静态属性已更改?

Posted

技术标签:

【中文标题】如何通知所有窗口静态属性已更改?【英文标题】:How to notify all windows that static property has changed? 【发布时间】:2021-12-18 17:06:34 【问题描述】:

我有很多窗口,当我来自 App.xaml.cs 的静态属性发生变化时,我需要更新所有 ListView。

App.xaml.cs:

    public partial class App : Application
    
        private static ObservableCollection<tasks> _AllTasks;

        public static ObservableCollection<tasks> AllTasks
        
            get => _AllTasks;
            set => _AllTasks = value;
        

        protected override void OnStartup(StartupEventArgs e)
        
            base.OnStartup(e);

            AllTasks = new ObservableCollection<tasks>(Core.db.tasks.ToList());
        
    

添加新任务:

        private void OnAddTaskExecuted(object p)
        
            tasks tsk = new tasks()
            
                taskname = "1",
                description = "",
                date = DateTime.Now,
                empID = 2
            ;
            Core.db.tasks.Add(tsk);
            Core.db.SaveChanges();
            App.AllTasks = new ObservableCollection<tasks>(Core.db.tasks.ToList());
        

如您所见,我正在添加一个新任务并重新定义静态字段。但我需要在不同窗口中的所有 ListView 来刷新。我假设我需要 AllTask​​s 集中的 PropertyChanged 事件,但我无法添加它,因为 AllTask​​s 是静态的。

【问题讨论】:

代替 App.AllTask​​s = new... 将项目添加到集合中:foreach(var task in Core.db.tasks.ToList())) App.AllTasks.Add(task); 如果需要在添加前清除:App.AllTasks.Clear(); 问题是当我添加一个新任务时。它添加了,但要看到它我需要重新打开窗口 那么问题出在其他地方......您不应该每次都创建一个新的可观察集合。您可以从中添加和删除项目。向我们展示您如何将此集合绑定到您的视图 好的,非常感谢 【参考方案1】:

问题是我不需要每次都创建一个新的 ObservableCollection 实例来刷新它。

我改了private void OnAddTaskExecuted(object p) 来自App.AllTasks = new ...App.AllTasks.Add(tsk); 并且成功了。

非常感谢@Nawed Nabi Zada

【讨论】:

以上是关于如何通知所有窗口静态属性已更改?的主要内容,如果未能解决你的问题,请参考以下文章

绑定到静态类属性[重复]

如何覆盖父对象的静态属性并让父对象访问 PHP 中的新值?

更改静态文本 C++ 的颜色

为啥我不能在 .net 核心中将静态属性与通知绑定?

静态文本字体参数变化

ES6 类 - 更新静态属性