0

你好我是新来的,以前是比较被动的读者。我正在学习 WPF + MVVM,我认为我在整个绑定概念中遗漏了一些东西。我将 flycapture2 SDK 用于点灰色相机,根据附加的示例,我应该在图像接收事件上调用 _ProgressChanged 并将接收到的图像绑定到 image.source 属性

private void m_worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    BitmapSource image = (BitmapSource)e.UserState;
    this.Dispatcher.Invoke(DispatcherPriority.Render,
    (ThreadStart)delegate ()
    {
        image.Source = image;
    }
    );
}

但这对我来说并不好,因为每次新图像到达时我们都会覆盖源图像。

我尝试做的(遵循一些在线教程)是通过 ViewModel 属性 Images_s 将 Image 控件源属性与后面的窗口代码绑定(将 DataContext 设置为 ViewModel),然后我希望每次更改 viewModel.Images_s 它应该更新用户界面。不幸的是,这不起作用,而是我得到了一个空窗口。

另外 - 我需要分派这个任务吗?正如我想象的那样,绑定应该在窗口代码中的图像变量更改事件时更新 UI 本身(或者我是否高估了 WPF 的超能力?)谢谢,

<Image Name="myImage" Source="{Binding Image_s}" Stretch="UniformToFill"/>

视图模型:

public class ViewModel : INotifyPropertyChanged
{
private BitmapSource img;

public event PropertyChangedEventHandler PropertyChanged;

public void NotifyPropertyChanged(string propName)
{
    if (this.PropertyChanged != null)
        this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
}


public BitmapSource Image_s
{
    get { return this.img; }
    set
    {
        this.img = value;
        this.NotifyPropertyChanged("Image_s");

    }
}

窗口代码:

viewModel = new ViewModel();
this.DataContext = viewModel;

视图模型:

    private void m_worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    BitmapSource image = (BitmapSource)e.UserState;
    this.Dispatcher.Invoke(DispatcherPriority.Render,
    (ThreadStart)delegate ()
    {
        viewModel.Image_s = image;
    }
    );
}
4

0 回答 0