2011-02-05 46 views
3

可以請你幫我諮詢或演示代碼以下任務:更改視圖模型屬性從另一個線程

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

所以我的問題是如何傳遞將在另一個線程在恆定循環中更改的屬性。

回答

3

通過傳遞父對象您應該有權訪問該屬性進行更改;不過,在執行此操作之前,您可能需要切換回UI線程(Dispatcher.Invoke),因爲「觀察者」模型的交叉線程變異很少能夠很好地結束。

另一種方法是讓代碼簡單地引發事件(與此屬性無關),並讓UI代碼切換到UI並更新視圖模型。這種方法將UI代碼與「執行」代碼完全分開(因爲「執行」代碼對視圖模型或線程沒有任何認識),如果您需要支持任意UI模型,該方法特別有用。

+0

+1。提高事件會是一個更好的解決方案。 –

相關問題