C# 装订字典';在带有wpf的列表框中设置s键和值
我试图将字典的键绑定到列表框中的网格行,并将字典的值绑定到网格的另一行。key的类型是Book,一个我编写的类,值的类型是int。 我想在网格中编写类的元素和整数值。 你能帮我吗?在确定要绑定的itemsSource和数据类型时,我非常困惑。 谢谢你的帮助 编辑:我忘了说我正在使用c#-wpf.=)C# 装订字典';在带有wpf的列表框中设置s键和值,c#,wpf,binding,dictionary,listbox,C#,Wpf,Binding,Dictionary,Listbox,我试图将字典的键绑定到列表框中的网格行,并将字典的值绑定到网格的另一行。key的类型是Book,一个我编写的类,值的类型是int。 我想在网格中编写类的元素和整数值。 你能帮我吗?在确定要绑定的itemsSource和数据类型时,我非常困惑。 谢谢你的帮助 编辑:我忘了说我正在使用c#-wpf.=) 我将字典作为itemsSource发送,并在objectdataprovider标记中将字典指定为type,并尝试通过以下代码发送值(int): < TextBlock Text="{Bin
我将字典作为itemsSource发送,并在objectdataprovider标记中将字典指定为type,并尝试通过以下代码发送值(int):
< TextBlock Text="{Binding Value, Mode=OneWay}" Grid.Row="1" Width="65" >
这是我在Window.xaml.cs中写的,Books是一个BookList,BookList是一种字典< 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>
我的代码还有一个问题——我看不到列表框中列出的项目。我的意思是我可以通过
列表框获取值。选择editem
但无法在列表框中查看。因此,我无法确定是否可以将整数值传递到所需的位置
所以我想我首先也需要帮助解决这个问题。。。
我写了一个我手工写的标签,另一个标签应该由数据绑定填充在同一行中,但我只能看到第一个标签,但我可以达到后面代码中的值。从网格元素中删除DataContext=“{StaticResource BookData}”
ObjectDataProvider将创建一个新的空图书列表,您的TextBlock将继承该DataContext。如果删除该属性,TextBlock将从ItemsControl中的当前项获取其DataContext,该项将是该行的KeyValuePair。您可能可以完全删除ObjectDataProvider元素,因为您正在代码中创建数据 下面的代码将显示以下内容:
1
Book 1
-------
2
Book 2
-------
3
Book 3
SelectedBookIndex将设置为所选书籍的索引,开始时将选择第二本书籍
XAML:
代码隐藏:
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; }
}
}
使用系统;
使用System.Collections.Generic;
使用系统诊断;
使用System.Windows;
名称空间测试演示
{
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
书籍=新字典();
Books.Add(newbook(){Name=“Book 1”},1);
Books.Add(newbook(){Name=“Book 2”},2);
Books.Add(newbook(){Name=“Book 3”},3);
SelectedBookIndex=2;
DataContext=this;
}
公共词典{get;set;}
私有整数_选择的图书索引;
公共整数选择图书索引
{
获取{return\u selectedBookIndex;}
设置
{
_selectedBookIndex=值;
Debug.WriteLine(“Selected Book Index=“+_selectedBookIndex”);
}
}
}
公共课堂用书
{
公共字符串名称{get;set;}
}
}
您使用的是什么语言/框架?对我来说这听起来像.NET,但你应该澄清一下。Cemre,你能和我们分享你的代码吗?但是我不应该实现对象类型吗?@cemregoksu:我不确定你说的“实现对象类型”是什么意思。您不需要向WPF提供任何类型信息;它将从对象的运行时类型读取它。如果要使用方法调用或提供构造函数参数在XAML中创建对象,则使用ObjectDataProvider。由于您已经有一个对象,您可以将其分配给ItemsSource。我无法这样做。。为什么?此解决方案将不再有效,因为您必须将字典更改为ObservalEditionary(必须实现INotifyCollectionChanged和INotifyPropertyChanged)“{Binding Path=Key.Name}”对我不起作用,但“{Binding Path=Key}”起作用。词典位于可观察集合中,文本位于数据模板中。
<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; }
}
}