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

PropertyChanged doesn't work if property was updated from another process?

问题是:如果另一个 window 改变位置,我希望我的 window 改变位置。我在另一个线程中有一个 运行 函数,它每 50 毫秒检查另一个 window 位置。如果我直接从另一个进程更改 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));            
        }
        get{return x;}
    }
    private double y;
    public double Y {
        set{
            y = value;
            OnPropertyChanged(nameof(Y));
        }
        get{return y;}
    }

但此代码不会调用我的 window 移动:

  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;
            }
            
        }
    }


 

它有如此简单的解决方案。我将绑定更改为 TwoWay 绑定,现在可以使用了:

 Left="{Binding X, Mode=TwoWay}"