Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 装订字典';在带有wpf的列表框中设置s键和值_C#_Wpf_Binding_Dictionary_Listbox - Fatal编程技术网

C# 装订字典';在带有wpf的列表框中设置s键和值

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

我试图将字典的键绑定到列表框中的网格行,并将字典的值绑定到网格的另一行。key的类型是Book,一个我编写的类,值的类型是int。 我想在网格中编写类的元素和整数值。 你能帮我吗?在确定要绑定的itemsSource和数据类型时,我非常困惑。 谢谢你的帮助

编辑:我忘了说我正在使用c#-wpf.=)


我将字典作为itemsSource发送,并在objectdataprovider标记中将字典指定为type,并尝试通过以下代码发送值(int):

< TextBlock Text="{Binding Value, Mode=OneWay}" Grid.Row="1" Width="65" >
这是我在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>


















我的代码还有一个问题——我看不到列表框中列出的项目。我的意思是我可以通过
列表框获取值。选择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; }
    }
}