1

単純なパワーポイント プログラムのように動作するプログラムがあります。私はMVVMパターンで働いていません。

ユーザーが作成したすべてのスライドを XML ファイルに保存し、後でこれを読み込んでいます。読み込まれたときにプログラムで現在作成されているすべてのスライドのプレビューを保存する My 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のみが表示されるのはなぜですか?

4

1 に答える 1

1

このコードはひどいです。それを修正しようとする代わりに、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);
            }
        }
    }
于 2013-08-12T11:39:56.743 に答える