WPF:未使用INotifyPropertyChanged更新UI

 我是vb小草 发布于 2022-12-29 18:10

我目前正在学习WPF,DataContexts和DataBinding.我的目标是使用一个任务栏任务(使用NotifyIconWpf),该任务具有运行后台的连续线程来监视网络.

我设法获得绑定到ProgramClock类的UI元素(显示在屏幕截图中),但是当ProgramClock更改时它不会更新,很可能是因为INotifyPropertyChanged参数中的某些内容是错误的.

我发现最接近的类似问题是UI未更新INotifyPropertyChanged但是我无法弄清楚要在XAML中更改DataPath的内容,或者如何使INotifyPropertyChanged正常工作.

请注意,BackgroundWorker线程成功更新了App的静态ProgramClock(使用单独的WinForm进行检查),并且该时间最初是在WPF中加载的,因此可能没有正确调用PropertyChanged.

在此输入图像描述

ProgramClock

public class ProgramClock : INotifyPropertyChanged
    {
        private DateTime _myTime;
        public event PropertyChangedEventHandler PropertyChanged;
        private ClockController clockController;

        public ProgramClock()
        {

            this._myTime = DateTime.Now;
            clockController = new ClockController();

            MessageBox.Show("created new clock");
        }

        public DateTime MyTime
        {
            get
            {
                return this._myTime;
            }

            set
            {
                if (_myTime == value) return;
                _myTime = value;

                //System.Windows.Forms.MessageBox.Show(PropertyChanged.ToString());
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs(_myTime.ToString()));
            }
        }

        public string MyTimeString
        {
            get { return this._myTime.ToString(); }
        }

        public void UpdateTime()
        {
            this.MyTime = DateTime.Now;
        }
    }

泡泡CS

public partial class InfoBubble : System.Windows.Controls.UserControl
{

    public InfoBubble()
    {
        InitializeComponent();
        this.DataContext = App.ClockBindingContainer;
    }
}

泡泡XAML


    
            
    

主要应用

public partial class App : System.Windows.Application
{

    private TaskbarIcon tb;
    private ResourceDictionary _myResourceDictionary;
    public static ProgramClock _programClock = new ProgramClock();

    private void Application_Startup(object sender, StartupEventArgs e)
    {
        NotifIconStarter();
    }

    public static ProgramClock ClockBindingContainer
    {
        get { return _programClock; }
    }
}

Daniel Kelle.. 5

一个问题是你调用PropertyChanged事件.您需要将正在更改的属性的名称传递给PropertyChangedEventArgs 新值.

所以使用:

if (PropertyChanged != null)
    PropertyChanged(this, new PropertyChangedEventArgs("MyTime"));

代替:

if (PropertyChanged != null)
    PropertyChanged(this, new PropertyChangedEventArgs(_myTime.ToString()));

但是,您实际上是绑定到另一个属性 - MyTimeString.

最终,您要约束的财产需要举办活动.

1 个回答
  • 一个问题是你调用PropertyChanged事件.您需要将正在更改的属性的名称传递给PropertyChangedEventArgs 新值.

    所以使用:

    if (PropertyChanged != null)
        PropertyChanged(this, new PropertyChangedEventArgs("MyTime"));
    

    代替:

    if (PropertyChanged != null)
        PropertyChanged(this, new PropertyChangedEventArgs(_myTime.ToString()));
    

    但是,您实际上是绑定到另一个属性 - MyTimeString.

    最终,您要约束的财产需要举办活动.

    2022-12-29 18:14 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有