Связывание ключа и значения словаря в списке с помощью wpf - PullRequest
13 голосов
/ 26 июля 2010

Я пытаюсь привязать ключ словаря к строке сетки в списке и привязать значение словаря к другой строке сетки.тип ключа - Book, класс, который написал, а тип значения - int.я хочу написать элементы класса и целочисленное значение в сетке.Можете ли вы помочь мне в этом?Я очень запутался в определении itemsSource и типа данных для привязки.спасибо за помощь

Редактировать: я забыл сказать, что я использую c # - wpf.=)


Я отправил словарь в качестве itemsSource, и я определил словарь как тип в теге objectdataprovider, и попытался отправить значение (int) следующим кодом:

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

и выбранный элемент был показан как [myNameSpace.Book, 4] вместо только 4.


BookListBox.ItemsSource = LibManager.Books;

это то, что я написал в Window.xaml.cs, а Books - это BookList, гдеBookList - это тип словаря .

и файла 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>

есть еще одна проблема с моим кодом - я не вижу в спискеэлементы в списке.Я имею в виду, я мог бы получить значения на ListBox.SelectedItem, но не мог видеть в списке.таким образом, я не могу быть уверен, смогу ли я передать целочисленное значение туда, куда я хочу.

Поэтому я думаю, что мне также сначала понадобится помощь для решения этой проблемы ... Я пишу метку, которую пишу вручную, идругая метка, которая должна быть заполнена связыванием данных в той же строке, но я вижу только первую метку, но я могу достичь значения в коде позади.

Ответы [ 2 ]

33 голосов
/ 26 июля 2010

Ниже кода будет отображаться следующее:

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

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>

Код позади:

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; }
    }
}
0 голосов
/ 26 июля 2010

Удалить DataContext="{StaticResource BookData}" из элемента сетки.

ObjectDataProvider создаст новый пустой BookList, и ваш TextBlock наследует этот DataContext.Если вы удалите этот атрибут, TextBlock получит свой DataContext из текущего элемента в ItemsControl, который будет KeyValuePair для этой строки.Вероятно, вы можете полностью удалить элемент ObjectDataProvider, поскольку вы создаете данные в коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...