c#WPF将OnResponse事件从singleton对象线程化到MainWindowViewModel

本文关键字:线程 MainWindowViewModel 对象 singleton OnResponse 事件 c#WPF | 更新日期: 2023-09-27 18:00:33

问候我的智能编程朋友!

我已经为一个对象创建了一个OnResponseEvent,该对象通过UnityContainer注入到我的视图模型中。

来自我的注入对象类:

    public delegate void ResponseEventHandler(AbstractResponse response);
    public event ResponseEventHandler OnResponseEvent;
Constructor for MainWindowViewModel:
public MainWindowViewModel(ITrack track)
        {
            this._track = Track;
            track.OnResponseEvent += UpdateTrackResponseWindow;
        }

在我的MainWindowViewModel:中创建了处理OnResponseEvent的委托

private delegate void HandleTrackResponseCallback(AbstractResponse message);

由于OnResponseEvent正在发送一条消息,我需要在一个单独的线程中解释该消息,并在listBox中显示
这就是我感到困惑的地方。如果我使用WinForms编写这个应用程序,我可以使用以下代码,因为WinForms知道我的listBox:

 if (ListBox.InvokeRequired)
    {
        var d = new HandleTrackResponseCallback(UpdateTrackResponseWindow);
        Invoke(d, new object[] { message });
    }
    else
        lstTrackResponse.Text = Interpret(message);  //Interpret is a separate method

但是,我使用的是WPF,并且MainWindowViewModel类对位于视图中的listBox一无所知。

有人能提供我如何在MainWindowViewModel类的另一个线程上处理OnResponseEvent的示例代码吗?

非常感谢,任何帮助都将不胜感激。

c#WPF将OnResponse事件从singleton对象线程化到MainWindowViewModel

从视图模型操作视图违背了MVVM的基本体系结构原则。即使它不是从另一个线程调用的,它仍然不是一件明智的事情

在MVVM中,您可以像处理需要在视图中显示的任何其他数据一样处理此问题:

  • 处理数据并将其存储在视图模型本身中(使用事件处理程序)
  • 将其公开为包含更改通知的属性
  • 使用传统的数据绑定从视图访问该属性

简单如:

<TextBox Text="{Binding Response}"/>

这种方法甚至可以处理线程问题,因为现在您可以在视图模型中而不是在视图中处理并发问题。只需在修改属性时锁定对TextBox.Text绑定到的属性的访问。

一般来说,MVVM避免了视图模型对视图的直接依赖,原因有几个:

  • 视图模型和视图之间松散耦合的全局目标
  • 在没有视图的情况下对视图模型进行单元测试的能力

起初,这种分离可能看起来很笨拙,需要额外的工作(见上文),但这确实是值得的,这也是我们需要做的,以获得MVVM方法的好处。