cem*_*ksu 13 c# wpf binding dictionary listbox
我试图绑定一个字典的键在一个表中网格的一个排,和字典的值绑定到网格的另一行.key的类型是Book,类是thati写的,值的类型是int.我想写一下类的元素和网格中的整数值.你能帮帮我吗?在确定itemsSource和要绑定的数据类型时我很困惑.谢谢你的帮助
编辑:我忘了说我正在使用c# - wpf.=)
我发送的词典作为的ItemsSource,以及i所指定的字典为类型中的ObjectDataProvider标签,并试图通过该代码来发送值(INT):
< TextBlock Text="{Binding Value, Mode=OneWay}" Grid.Row="1" Width="65" >
Run Code Online (Sandbox Code Playgroud)
并且selecteditem显示为[myNameSpace.Book,4]而不是4.
BookListBox.ItemsSource = LibManager.Books;
Run Code Online (Sandbox Code Playgroud)
这是我在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>
Run Code Online (Sandbox Code Playgroud)
我的代码还有一个问题 - 我无法看到列表框中列出的项目.我的意思是我可以获取值,ListBox.SelectedItem但在列表框中看不到.因此,我无法确定是否可以将整数值传递到我想要的位置.
所以我想我首先需要帮助解决这个问题...我写了一个手工编写的标签,另一个标签应该由同一行中的数据绑定填充,但我可以看到第一个标签,但我可以达到后面的代码值.
Wal*_*mer 33
下面的代码将显示以下内容:
1
Book 1
-------
2
Book 2
-------
3
Book 3
Run Code Online (Sandbox Code Playgroud)
SelectedBookIndex将被设置为所选书籍的索引,在开始时将选择第二本书.
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>
Run Code Online (Sandbox Code Playgroud)
代码背后:
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; }
}
}
Run Code Online (Sandbox Code Playgroud)