辞書のキーをリストボックスのグリッドの行にバインドし、辞書の値をグリッドの別の行にバインドしようとしています。キーのタイプは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
がリストボックスに表示されませんでした。したがって、整数値を必要な場所に渡せるかどうか確信が持てません。
だから私はこの問題にも最初に助けが必要だと思います...私は手で書くラベルと、同じ行にデータバインディングで埋める必要がある別のラベルを書きますが、最初のラベルだけを見ることができますが、コードビハインドの値に到達します。
以下のコードは以下を示します:
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; }
}
}
削除する DataContext="{StaticResource BookData}"
グリッド要素から。
ObjectDataProviderは新しい空のBookListを作成し、TextBlockはそのDataContextを継承します。その属性を削除すると、TextBlockは、その行のKeyValuePairになるItemsControlの現在の項目からDataContextを取得します。コードでデータを作成しているので、おそらくObjectDataProvider要素を完全に削除できます。