从另一个线程更改视图模型属性

4

请问您能否为以下任务提供建议或演示代码:

我有一个WPF程序,它会不断监听串口。如果接收到特定信号,则应更改ViewModel中的属性。监听器在另一个线程上启动,因此我想知道如何从另一个线程更改ViewModel属性。我尝试通过引用传递属性,但这是不可能的。

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    //My property in the view model
    private Boolean _Lock;
    public Boolean Lock
    {
        get { return _Lock; }
        set
        {
            _Lock = value;
            OnPropertyChanged("Lock");
        }
    }

 //Start the listener thread
        Thread ComListenThread = new Thread(delegate() 
            {                  
                Com cm = new Com(Path,Lock);                    
                cm.Start();                    
            });
        ComListenThread.Start();


class Com
{

    private Uri web { get; set; }
    private Boolean Lock { get; set; }

    public Com(Uri Path,Boolean _Lock)
    {
        web = Path;                                
        Lock = _Lock;                                              
    }


    public void Start()
    {
        try
        {
            port = new SerialPort(portName, baudRate, parity, dataBits, stopBits);

        }
        catch (Exception e)
        {
            MessageBox.Show("Reason {0}:", e.Message);
        }

        port.ReadTimeout = 500;
        port.Open();

        int position = 0;            
        while (true)
        {

            try
            {
                int len = port.Read(data, position, data.Length - position);
                position += len;
            }
            catch (TimeoutException)
            {


                //How to change Lock property 
                Lock = (data[2]==5)?true:false;


                position = 0;
            }
        }
    }                      
}

所以我的问题是如何传递在另一个线程中将被不断更改的属性。
1个回答

3
通过传递父对象,您应该可以访问属性以进行更改;但是,在执行此操作之前,您可能需要切换回UI线程(Dispatcher.Invoke),因为跨线程突变“观察者”模型很少会有好结果。
另一种方法是让您的代码简单地引发事件(与此属性无关),并使您的UI代码切换到UI线程并更新视图模型。此方法将UI代码与“执行”代码干净地分离(因为“执行”代码不知道视图模型或线程),如果您需要支持任意UI模型,则特别有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接