web-dev-qa-db-ja.com

リストボックスの辞書のキーと値をwpfでバインドする

辞書のキーをリストボックスのグリッドの行にバインドし、辞書の値をグリッドの別の行にバインドしようとしています。キーのタイプはBookであり、私が書いたクラスであり、値のタイプはintです。クラスの要素と整数値をグリッドに書き込みます。これについて私を助けてくれませんか?バインドするitemsSourceとデータ型を決定するのにかなり混乱しています。助けてくれてありがとう

編集:私はc#-wpfを使用していることを忘れていました。 =)


辞書をitemsSourceとして送信し、辞書をobjectdataproviderタグのタイプとして指定し、次のコードで値(int)を送信しようとしました。

< TextBlock Text="{Binding Value, Mode=OneWay}" Grid.Row="1" Width="65" >

選択されたアイテムは、4つだけではなく[myNameSpace.Book、4]として表示されました。


BookListBox.ItemsSource = LibManager.Books;

これは私がWindow.xaml.csで書いたもので、BooksはBookListです。BookListは辞書のタイプです<Book、int>。

とxamlファイル:

< ListBox Height="571" HorizontalAlignment="Left" Margin="444,88,0,0"
          Name="BookListBox" VerticalAlignment="Top" Width="383" >
        < ListBox.Resources>
            <ObjectDataProvider x:Key="BookData"
                                ObjectType="{x:Type local:BookList}"/>
        </ListBox.Resources>
        < ListBox.ItemTemplate>
            < DataTemplate>
                < Border BorderThickness="2" BorderBrush="Black" Margin="5"
                         CornerRadius="5" Width="350" >
                    < Grid DataContext="{StaticResource BookData}" >
                        < Grid.ColumnDefinitions>
                            < ColumnDefinition/>                        
                        </Grid.ColumnDefinitions>
                        < Grid.RowDefinitions>
                            < RowDefinition/>
                            < RowDefinition/>
                        < /Grid.RowDefinitions>
                        < Label Content="count: " />
                        < TextBlock Text="{Binding Value, Mode=OneWay}"
                                    Grid.Row="1" Width="65"/>
                    < /Grid>
                < /Border>
            < /DataTemplate>
        < /ListBox.ItemTemplate>
    < /ListBox>

コードにもう1つの問題があります-リストボックスにリストされた項目が表示されません。つまり、ListBox.SelectedItemがリストボックスに表示されませんでした。したがって、整数値を必要な場所に渡せるかどうか確信が持てません。

だから私はこの問題にも最初に助けが必要だと思います...私は手で書くラベルと、同じ行にデータバインディングで埋める必要がある別のラベルを書きますが、最初のラベルだけを見ることができますが、コードビハインドの値に到達します。

14
cemregoksu

以下のコードは以下を示します:

1
Book 1
-------
2
Book 2
-------
3
Book 3

SelectedBookIndexは選択されたブックのインデックスに設定され、最初に2番目のブックが選択されます。

XAML:

<Window x:Class="TestDemo.MainWindow"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">

    <StackPanel>
        <ListBox 
            ItemsSource="{Binding Path=Books}"
            SelectedValuePath="Value"
            SelectedValue="{Binding Path=SelectedBookIndex}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Border BorderBrush="Black" BorderThickness="2">
                        <StackPanel>
                            <TextBlock Text="{Binding Path=Value}" />
                            <TextBlock Text="{Binding Path=Key.Name}" />
                        </StackPanel>
                    </Border>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </StackPanel>
</Window>

コードビハインド:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows;

namespace TestDemo
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            Books = new Dictionary<Book, int>();
            Books.Add(new Book() { Name = "Book 1"}, 1);
            Books.Add(new Book() { Name = "Book 2" }, 2);
            Books.Add(new Book() { Name = "Book 3" }, 3);

            SelectedBookIndex = 2;

            DataContext = this;
        }

        public Dictionary<Book, int> Books { get; set; }

        private int _selectedBookIndex;
        public int SelectedBookIndex
        {
            get { return _selectedBookIndex; }
            set
            {
                _selectedBookIndex = value;
                Debug.WriteLine("Selected Book Index=" + _selectedBookIndex);
            }
        }
    }

    public class Book
    {
        public string Name { get; set; }
    }
}
33

削除する DataContext="{StaticResource BookData}"グリッド要素から。

ObjectDataProviderは新しい空のBookListを作成し、TextBlockはそのDataContextを継承します。その属性を削除すると、TextBlockは、その行のKeyValuePairになるItemsControlの現在の項目からDataContextを取得します。コードでデータを作成しているので、おそらくObjectDataProvider要素を完全に削除できます。

0
Quartermeister