ListViewItem.Content仅更新ListView c#WPF中的最后一项

本文关键字:最后 一项 Content 更新 ListView c#WPF ListViewItem | 更新日期: 2023-09-27 18:27:15

我有一个程序,它的工作原理就像一个简单的电源点程序。我不是在MVVM模式中工作。

我将用户创建的所有幻灯片保存到一个XML文件中,然后在以后读回来。"我的ListView"在加载时存储程序中当前创建的所有幻灯片的预览,它只加载列表中最后一张幻灯片的ListView.Items.Content。

以下是我用来读取XML文件的代码。

private void Load()
        {
            List<SlideItems> listProjectContents = DeSerializeObjects();
            if (listProjectContents != null)
            {
                int loadCount = 0;
                foreach (SlideItems slide in listProjectContents)
                {
                    CreateNewSlide();
                    ListViewItem i = (ListViewItem)slideListView.Items[loadCount++];
                    BitmapSource bSource = Base64ToImage(slide.slidePreview);
                    Image img = new Image();
                    img.Source = bSource;
                    img.Height = 90;
                    img.Width = 190;
                    Border b = new Border();
                    StackPanel s = new StackPanel();
                    TextBlock t = new TextBlock();
                    t.Inlines.Add(loadCount.ToString());
                    s.Children.Add(t);
                    s.Children.Add(img);
                    b.Child = s;
                    i.Content = b;
                }
            }
        }

有人能从中看出为什么当我从XML文件加载时,只显示最后一个ListView项的ListView.Items.Content吗??

ListViewItem.Content仅更新ListView c#WPF中的最后一项

这段代码太糟糕了。与其试图修复它,不如试着了解wpf中是如何完成的。即使出于某种原因您没有使用MVVM,您也可以(也应该)使用数据绑定。在你的情况下,你应该

1) 定义数据模板:

<ListView x:Name="slideListView">
  <ListView.ItemTemplate>
    <DataTemplate>
        <Border>
            <StackPanel>
                <TextBlock Text="{Binding Text}"/>
                <Image Width="190" Height="90" Source="{Binding Image}"/>
            </StackPanel>
        </Border>
    </DataTemplate>
  </ListView.ItemTemplate>
</ListView>

2) 定义项目

class MyItem
{
    public BitmapSource Image { get; set; }
    public string Text { get; set; }
}

3) 填充您的ListView(应该使用MVVM来完成,但哦,好吧)

    private void Load()
    {
        slideListView.Items.Clear();
        List<SlideItems> listProjectContents = DeSerializeObjects();
        if (listProjectContents != null)
        {
            int loadCount = 0;
            foreach (SlideItems slide in listProjectContents)
            {
                BitmapSource bSource = Base64ToImage(slide.slidePreview);
                var item = new MyItem { Text = (loadCount++).ToString(), Image = bSource };
                slideListView.Items.Add(item);
            }
        }
    }