【问题标题】:WPF - Binding ObservableCollection to ListViewWPF - 将 ObservableCollection 绑定到 ListView
【发布时间】:2017-09-29 19:28:00
【问题描述】:

我正在使用我的 USB 网络摄像头(aforge 库)捕获图像并将捕获的图像存储在 ObservableColection

public ObservableCollection<BitmapImage> Images { get; set; }

Images 是我的视图模型类的属性。

class MainViewModel : INotifyPropertyChanged

    private ObservableCollection<BitmapImage> images = new ObservableCollection<BitmapImage>();
    public ObservableCollection<BitmapImage> Images
    {
        get
        {
            return this.images;
        }
        set
        {
            if (images == value)
                return;
            this.images = value;
            OnPropertyChanged("Images"); // Using the INotifyPropertyChanged interface to raise property change events
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    } 

在我的SecondWindow 中,我想在Listview 中显示捕获的图像。试过这个绑定:

private SecondWindow OwnerWindow;
public MainViewModel OwnerWindowViewmodel { get; set; }

在构造函数中

this.OwnerWindow = (SecondWindow)window;
this.OwnerWindowViewmodel = OwnerWindow.OwnerWindowViewmodel;
OwnerWindowViewmodel = (MainViewModel)this.DataContext;

Xaml:

<ListView x:Name="ListView" ItemsSource="{Binding Images, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Height="345"  Margin="567,10,10,0" VerticalAlignment="Top">
            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <UniformGrid Columns="1" HorizontalAlignment="Center" VerticalAlignment="Top"/>
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Vertical">
                        <Image Source="{Binding}" Height="150" Width="150"/>
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

但我的Listview 中没有任何内容。我已经通过添加断点和调试捕获图像的数量及其在断点处的正确性进行了测试(假设我已经捕获了 2 张图像,图像数量为 2) 如何在我的Listview 中显示捕获的图像?

【问题讨论】:

  • 调试输出中是否有任何绑定错误?
  • 你的 ViewModel 设置为 DataContext 了吗?
  • 如果您不向我们提供最基本的信息,您认为我们可以如何帮助您?如何创建和显示 SecondWindow,以及如何将视图模型实例传递给它的 DataContext?
  • 请注意,在 ItemsSource Binding 上设置 Mode=TwoWayUpdateSourceTrigger=PropertyChanged 是没有意义的。
  • 我已在我的视图中将 ViewModel 设置为 DataContext

标签: wpf listview binding observablecollection


【解决方案1】:

我没有发现您的代码有任何问题,我认为问题出在 BitmapImage 集合上。 请找到初始化BitmapImage的正确方法:

BitmapImage image = new BitmapImage();
image.BeginInit();
image.UriSource = new Uri(@"C:\Users\Public\Pictures\Sample Pictures\Lighthouse.jpg");
image.EndInit();

BitmapImage image = new BitmapImage(new Uri(@"C:\Users\Public\Pictures\Sample Pictures\Lighthouse.jpg"));

PS:这只是举例,请确保您以类似的方式初始化图像。

【讨论】:

  • 除此之外没有回答问题,您在这里展示的不是“初始化 BitmapImage 的正确方法”,而只是一种方法。您也可以使用带有 Uri 参数的 BitmapImage 构造函数,从而保存 BeginInit 和 EndInit 调用。
  • 我在我的测试项目中使用了相同的代码,我可以看到图像(我在本地加载的),如果集合没问题,那么数据上下文绑定肯定有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 2018-05-21
  • 2011-06-20
  • 1970-01-01
相关资源
最近更新 更多