使用wpf将列表框中的字典键和值绑定

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)

  • 该解决方案将不再有效,因为您必须将字典更改为 ObservableDictionary (它必须实现 INotifyCollectionChanged 和 INotifyPropertyChanged) (2认同)