绑定字典的键和值与WPF列表框 [英] Binding a Dictionary's key and value in a listbox with wpf

查看:840
本文介绍了绑定字典的键和值与WPF列表框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图绑定一个字典的关键在一个表中网格的一排,和字典的值绑定到网格的另一行。关键的类型是图书,thati写了和值的类型为int的一类。
我想写类并在网格中的整数值的元素。
你能帮助我在这?我在确定的ItemsSource和绑定的数据类型很困惑。
感谢帮助

I am trying to bind a dictionary's key to a row of the grid in a listbox, and bind the dictionary's value to another row of the grid. key's type is Book, a class thati wrote and the value's type is int. i want to write the elements of the class and the integer value in grid. Can you help me on this? I'm quite confused on determining the itemsSource and the data type to bind. thanks for helping

编辑:我忘了说,我使用C# - WPF。 =)

i forgot to say that i am using c# - wpf. =)

我送字典的ItemsSource时,我指定的字典类型在ObjectDataProvider的标签,并试图通过这个code发送的值(INT):

I sent the dictionary as the itemsSource, and i specified the dictionary as type in objectdataprovider tag, and tried to send the value (int) by this code:

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

和则selectedItem被证明为[myNameSpace.Book,4],而不是仅为4。

and the selecteditem was shown as [myNameSpace.Book, 4] instead of only 4.

BookListBox.ItemsSource = LibManager.Books;

这是我在Window.xaml.cs和书籍写一个书单,其中书目是一种类型的字典&LT的;图书,诠释>。

this is what I wrote in Window.xaml.cs and Books is a BookList, where BookList is a type of dictionary< 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>


有一个与我的$ C $一个更多的问题C--我不能看到在列表框中列出的项目。我的意思是我可以用 ListBox.SelectedItem 获取值,但在列表框中都看不到。因此,我不能肯定,如果我能传递整数值我想去的地方。


there is one more problem with my code-- I cant see the listed items in listbox. I mean I could get the values by ListBox.SelectedItem but couldn't see in the listbox. thus I can't be sure if I could pass the integer value to where I want.

所以我想我还需要帮助,这个问题先...
我写,我写的手一个标签,而另一个标签应该由数据在同一行结合填写,但我可以看到的第一个标签,但我可以达到code背后的价值。

So I think I also need help for this problem first... I write a label that I write by hand, and another label that should be filled by data binding in the same row but I can just see the first label, but I can reach the value in code behind.

推荐答案

下面code将显示如下:

Below code will show the following:

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

SelectedBookIndex将被设置到所选择的书的指数,在开始第二书将被选择。

SelectedBookIndex will be set to the index of the selected book, at start the second book will be selected.

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>

背后code:

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; }
    }
}

这篇关于绑定字典的键和值与WPF列表框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆