Изменить свойство viewmodel из другого потока - PullRequest
3 голосов
/ 05 февраля 2011

Пожалуйста, помогите мне советом или демонстрационным кодом для следующего задания:

У меня была программа в 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 голосов
/ 05 февраля 2011

Передав родительский объект , вы должны иметь доступ к свойству, чтобы изменить его;тем не менее, вы можете захотеть переключиться обратно на поток пользовательского интерфейса (Dispatcher.Invoke) перед тем, как сделать это, поскольку перекрестная мутация моделей "наблюдателя" редко заканчивается хорошо.событие (не имеет ничего общего с этим свойством), и ваш код пользовательского интерфейса переключается на шаг пользовательского интерфейса и обновляет модель представления.Этот подход четко отделяет код пользовательского интерфейса от кода «делающего» (так как код «делающего» ничего не знает о модели представления или поточной обработке) и особенно полезен, если вам необходимо поддерживать произвольные модели пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...