如果属性是从另一个进程更新的,PropertyChanged 不起作用?

Posted

技术标签:

【中文标题】如果属性是从另一个进程更新的,PropertyChanged 不起作用?【英文标题】:PropertyChanged doesn't work if property was updated from another process? 【发布时间】:2021-04-15 23:51:23 【问题描述】:

问题是:如果另一个窗口改变位置,我希望我的窗口改变位置。我在另一个线程中运行了一个函数,该函数每 50 毫秒检查另一个窗口位置。如果我直接从另一个进程中更改 myWindow.Left 和 myWindow.Top ,一切正常:

 Application.Current.Dispatcher.Invoke((System.Action)delegate
     this.Left = newTablePosition.Left + xShift;
     this.Top = newTablePosition.Top + yShift;                     
 );

但如果我尝试将 Window.Left 绑定到 X 并将 Window.Top 绑定到 Y,然后从另一个线程更改 X 和 Y,它就不起作用。我已经实现了 INotifyPropertyChanged:

public double X
        set
            x = value;              
            OnPropertyChanged(nameof(X));            
        
        getreturn x;
    
    private double y;
    public double Y 
        set
            y = value;
            OnPropertyChanged(nameof(Y));
        
        getreturn y;
    

但是这段代码不会调用我的窗口移动:

  Application.Current.Dispatcher.Invoke((System.Action)delegate
                    X = newTablePosition.Left + xShift + HUDPosition.x;
                    Y = newTablePosition.Top + yShift + HUDPosition.y;  )

我是这样调用这段代码的:

  Thread newthread = new Thread(CheckTablePosition)IsBackground = true;
        isActive = true;
        newthread.Start();

及功能:

public void
    CheckTablePosition()
        while (isActive)
            Thread.Sleep(50);
            var newTablePosition = new TablePosition(_table.hWnd);   
            if (_tablePosition.IsEqual(newTablePosition))
                continue;
            
            _tablePosition = newTablePosition;
            var xShift = (int) (newTablePosition.Width * _defaultPosition.x);
            var yShift  = (int) (newTablePosition.Height * _defaultPosition.y);

            try 
                Application.Current.Dispatcher.Invoke((System.Action)delegate
                    this.Left = newTablePosition.Left + xShift + HUDPosition.x;
                    this.Top = newTablePosition.Top + yShift + HUDPosition.y;                     
                    OnPropertyChanged(nameof(Y)););
            
            catch(Exception ex) 
                MessageBox.Show(ex.ToString());
                break;
            
            
        
    


 

【问题讨论】:

【参考方案1】:

它有这么简单的解决方案。我将绑定更改为双向绑定,现在可以使用:

 Left="Binding X, Mode=TwoWay"

【讨论】:

以上是关于如果属性是从另一个进程更新的,PropertyChanged 不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

如果在另一个进程中编辑 sharedPreferences 将不会更新

silverlight属性改变事件通知

从另一个对象调用时 UIImage 不更新

可以将HASH密钥更新为预先存在的Dynamodb全局二级索引的另一个属性吗?

每次另一个另一个进程更新文件时如何从文件中读取

通过MSI属性指定MSI转换