Связывание ключа словаря и значения в списке с wpf
Я пытаюсь привязать ключ словаря к строке сетки в списке и привязать значение словаря к другой строке сетки. Тип ключа - это книга, класс, который написал и тип значения - int.
Я хочу написать элементы класса и целочисленное значение в сетке.
Можете ли вы мне помочь? Я довольно смущен тем, что вы определяете itemsSource и тип данных для привязки.
спасибо за помощь
Изменить: я забыл сказать, что я использую С# - 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 - это тип словаря < 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>
есть еще одна проблема с моим кодом - я не могу видеть перечисленные элементы в списке. Я имею в виду, что я мог бы получить значения ListBox.SelectedItem
, но не мог видеть в списке. поэтому я не могу быть уверен, могу ли я передать целочисленное значение туда, где я хочу.
Так что я думаю, что мне также нужна помощь для этой проблемы в первую очередь...
Я пишу ярлык, который я пишу вручную, и другую метку, которая должна быть заполнена привязкой данных в той же строке, но я могу просто увидеть первый ярлык, но я могу достичь значения в коде.
Ответы
Ответ 1
Ниже приведен код:
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; }
}
}
Ответ 2
Удалите DataContext="{StaticResource BookData}"
из элемента Grid.
ObjectDataProvider создаст новый пустой список BookList, и ваш TextBlock наследует этот DataContext. Если вы удалите этот атрибут, TextBlock получит свой DataContext из текущего элемента в ItemsControl, который будет KeyValuePair для этой строки. Вероятно, вы можете полностью удалить элемент ObjectDataProvider, поскольку вы создаете данные в коде.