WPF-将列表绑定到listview

时间:2017-04-25 08:06:23

标签: c# wpf listview binding

我正在创建一个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>

有人可以帮助我,我失踪了吗?

4 个答案:

答案 0 :(得分:4)

非常感谢,我已经解决了你的问题。我想与其他可能与我有同样问题的人分享我的工作代码。这是工作代码:

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>

答案 1 :(得分:3)

一些问题

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

  2. listOfCapturedImages是一个字段。即使您设置为public,它也不能用于在WPF中绑定。因为Field XAML是不可见的,而属性是可见的。这样做

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

答案 2 :(得分:1)

您绑定的是字段而不是属性。

变化:

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>

答案 3 :(得分:1)

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

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