INotifyPropertyChanged没有在WndProc消息内连接

时间:2017-11-16 20:13:31

标签: c# wpf mvvm data-binding wndproc

我目前正在使用WPF中的Windows桌面应用程序。它是围绕MVVM模式构建的,因此视图在Telerik库的帮助下通过INotifyPropertyChanged绑定到viewmodel。整个应用程序运行良好,但一个模块需要来自硬件仪器的消息。该仪器仅通过WndMessage发送信息,这意味着我们实现了WndProc方法。

WndProc方法按预期工作,但视图未收到任何绑定调用。我们测试了WndProc之外的绑定,它们运行良好。遗憾的是,我们试图通过调用和手动刷新来触发通知,但无济于事。

在WndProc期间,是否有办法让通知消息到达视图?我提供了代码片段,但代码本身非常简单。

数据绑定

public List<PlotCoordinate> PointsList
{
    get
    {
        return _pointsList;
    }
}

WndProc消息接收

private static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    MainWindowViewModel viewModel = _dataContext;
    InstrumentViewModel instrument = viewModel.InstrumentViewModelReference as InstrumentViewModel;
    instrument?.ProcessMessage(hwnd, msg, wParam, lParam, ref handled);

    return IntPtr.Zero;
}

WndProc中的数据操作

public void DrawGraphFromInstrumentData()
{
    // Clear previous data and prepare new series
    _pointsList = new List<PlotCoordinate>();

    // ... fill the list with new data

    OnPropertyChanged("PointsList");
}

非常感谢任何见解。

修改

经过一番愚弄,我觉得我设法找出了问题所在。问题不在于_dataContext,而是在这一行:

InstrumentViewModel instrument = viewModel.InstrumentViewModelReference as InstrumentViewModel;

使用_dataContext直接激活PropertyChanged,但使用instrument则不会。我会继续研究这个。

1 个答案:

答案 0 :(得分:0)

使用char *bookings[][0]=firstname, *bookings[][1]=secondname, *bookings[][2]=dob;代替您的ObservableCollection<PlotCoordinate>。添加到此列表时,请确保在UI线程上,并且您的View应该识别何时添加新项目,而不是仅在更改List本身时。