WPF-将列表绑定到列表视图

Posted

技术标签:

【中文标题】WPF-将列表绑定到列表视图【英文标题】:WPF- Bind list to listview 【发布时间】:2017-09-22 03:08:54 【问题描述】:

我正在创建一个 wpf 应用程序并从我的 USB 网络摄像头捕获图像。我尝试将所有捕获的图像存储在List 中,并在Listview 中显示它们

public List<BitmapImage> listOfCapturedImages = new List<BitmapImage>();

private void addNewImageButton_Click(object sender, RoutedEventArgs e)
        
            CameraWindow cw = new CameraWindow(this);
            cw.newlyCapturedImage += (BitmapImage newImage) =>
            
                listOfCapturedImages.Add(newImage);
                newlyAddedImage.Source = newImage;
            ;
            cw.Show();
        

XAML:

<ListView ItemsSource="Binding listOfCapturedImages" Height="345" Margin="577,10,10,0" VerticalAlignment="Top">            
            <ListView.View>
                <GridView>
                    <GridView.ColumnHeaderContainerStyle>
                        <Style TargetType="GridViewColumnHeader">
                            <Setter Property="Visibility" Value="Collapsed"/>
                        </Style>
                    </GridView.ColumnHeaderContainerStyle>
                    <GridViewColumn x:Name="previewImagesColumn">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Vertical">
                                <Button x:Name="firstImageOflistViewButton" Content="Binding listOfCapturedImages" Height="50">
                                    <Button.Template>
                                        <ControlTemplate TargetType="Button">
                                            <ContentPresenter/>
                                        </ControlTemplate>
                                    </Button.Template>
                                </Button>
                                </StackPanel>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>

有人可以帮我吗,我缺少什么?

【问题讨论】:

【参考方案1】:

几个问题

    使用ObservableCollection 而不是ListList 在添加项目时不通知 View 更新自身。 ObservableCollection 就是这样做的。

    listOfCapturedImages 是一个字段。即使设置为public,也不能用于WPF中的绑定。因为字段对XAML 是不可见的,而属性是可见的。所以这样做

    public ObservableCollection<BitmapImage> listOfCapturedImages  get;  = 
       new ObservableCollection<BitmapImage>();
    

【讨论】:

Xaml 怎么样?我也可以在那里进行更改吗? Tadej 涵盖了 Xaml 问题,这涵盖了问题背后的代码,它们涵盖了所有内容【参考方案2】:

非常感谢大家,在你们的帮助下我已经解决了我的问题。我想只为可能与我有同样问题的其他人分享我的工作代码。这是工作代码:

public ObservableCollection<BitmapImage> listOfCapturedImages  get;  = 
   new ObservableCollection<BitmapImage>();

private void addNewImageButton_Click(object sender, RoutedEventArgs e)
        
            CameraWindow cw = new CameraWindow(this);
            cw.newlyCapturedImage += (BitmapImage newImage) =>
            
                listOfCapturedImages.Add(newImage);
                newlyAddedImage.Source = newImage;
            ;
            cw.Show();
        

我也加了this.DataContext = this;

public Test(Window window)
        
            InitializeComponent();
            this.DataContext = this;          
        

最后是 XAML:

<ListView ItemsSource="Binding listOfCapturedImages" Height="345" Margin="577,10,10,0" VerticalAlignment="Top">
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Columns="1"/>
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>
        <ListView.ItemTemplate>
            <DataTemplate>
                <Image Source="Binding"/>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

【讨论】:

【参考方案3】:

您正在绑定到字段而不是属性。

变化:

public List<BitmapImage> listOfCapturedImages = new List<BitmapImage>();

public ObservableCollection<BitmapImage> ListOfCapturedImages get; = new ObservableCollection<BitmapImage>();

ObservableCollection 是通知其内容更改的集合,并且在您向其中添加项目后绑定将更新。 List 不会那样做。

还包括一些Image显示项:

<ListView ItemsSource="Binding ListOfCapturedImages" >
    <ListView.ItemTemplate>
        <DataTemplate>
            <Image Source="Binding"/>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

【讨论】:

好的答案栏你关于图像控制的观点缺乏任何背景【参考方案4】:

您的DataTemplate 中应该有Image 控件。这就是我正在使用的:

<ListView ItemsSource="Binding listOfCapturedImages" >
     <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="1"/>
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
    <ListView.ItemTemplate>
        <DataTemplate>
            <Image Source="Binding"/>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

【讨论】:

您错过了绑定问题,但遇到了 XAML 问题

以上是关于WPF-将列表绑定到列表视图的主要内容,如果未能解决你的问题,请参考以下文章

WPF:将列表动态绑定到(某些)对象的属性

如何在 WPF / MVVM 中对绑定到相同实例的两个列表视图进行不同选择

选定的 WPF 列表框绑定仅更新视图中的项目

WPF 列表框 + 绑定 + IDataErrorInfo =?

使用绑定时滚动 Xamarin Forms 列表视图

Wpf 主从列表视图绑定