Обмен данными между Сервисом и ViewModel - PullRequest
0 голосов
/ 12 ноября 2018

Я использую WPF и архитектуру MVVM. Мне нужно обновить свое представление и модель данных любыми полученными последовательными данными, которые могут быть в любое время.

Для реализации этого у меня есть

public static partial class SerialPortService
{
    private static SerialPort Port = new SerialPort
    {
        Handshake = Handshake.None,
        BaudRate = 9600,
        ReadTimeout = 400,
        DiscardNull = false,
        ReceivedBytesThreshold = 1,
        WriteTimeout = 100
    };

    public static string PortName
    {
        get => Port.PortName;
        set => Port.PortName = value;
    }

    public static SerialDataReceivedEventHandler DataReceived
    {
        set => Port.DataReceived += value;
    }

    public static void OpenCOMPort()
    {
        try
        {
            Port.Open();
            Port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
        }
        catch(Exception ex)
        {
            Debug.Print("Exception caught while opening " + Port.PortName + Environment.NewLine + ex.ToString());
        }   
    }

    public static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        Byte[] rx_buffer = new Byte[ReadLength];    // ReadLength is set elsewhere

        try
        {
            for (int i = 0; i < ReadLength; i++)
            {
                rx_buffer[i] = (Byte)Port.ReadByte();
            }

            // update the viewModel with the data in rx_buffer here?!
        }
        catch(Exception ex)
        {
            if (Port.IsOpen)
            {
                Port.ReadExisting();        // Clears input buffer
            }

            Debug.Print(ex.ToString());
        }
    }

Всякий раз, когда я получаю данные через DataReceivedHandler (), я хочу сообщить viewModel, что есть новые данные для отображения и сохранить их в моей модели (это только полученные байты и цвет, связанный со значением первого байт).

Каков наилучший способ сообщить об этом в viewModel?

Я также пытался обновить модель непосредственно из класса SerialPortService, но я получил ошибку, связанную со схожестью потоков.

Спасибо!

1 Ответ

0 голосов
/ 12 ноября 2018

Добавьте событие в SerialPortService, чтобы ViewModel мог прослушивать события добавления данных:

    static public event EventHandler<NewDataReceivedArgs> NewDataReceived;

    static public void OnNewDataReceived(byte[] data)
    {
        var handler = NewDataReceived;
        if (handler != null)
        {
            handler(null, new NewDataReceivedArgs(){Data = data});
        }
    }

    public class NewDataReceivedArgs : EventArgs
    {
        public byte[] Data { get; set; }
    }

Тогда в вашем DataReceivedHandler:

// update the viewModel with the data in rx_buffer here?!
OnNewDataReceived(rx_buffer);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...