C# 我的Items Control&;有什么问题;数据绑定?

C# 我的Items Control&;有什么问题;数据绑定?,c#,wpf,data-binding,datatemplate,itemscontrol,C#,Wpf,Data Binding,Datatemplate,Itemscontrol,我正在修改我的简单十六进制编辑器,以练习使用我最近学到的WPF中的数据绑定。我不确定我做错了什么 据我所知,对于集合“backend”(从ObservableCollection继承)中的每个字节,我的ItemsControl应该应用参考资料下的DataTemplate。此模板只是一个绑定到值转换器的文本框。所以我希望看到一行文本框,每个文本框包含一个字节的字符串表示。当我使用这个XAML时,我得到的只是一行不可编辑的文本,据我所知,它没有使用文本框。我做错了什么 我已经在下面粘贴了我的XAML

我正在修改我的简单十六进制编辑器,以练习使用我最近学到的WPF中的数据绑定。我不确定我做错了什么

据我所知,对于集合“backend”(从ObservableCollection继承)中的每个字节,我的ItemsControl应该应用参考资料下的DataTemplate。此模板只是一个绑定到值转换器的文本框。所以我希望看到一行文本框,每个文本框包含一个字节的字符串表示。当我使用这个XAML时,我得到的只是一行不可编辑的文本,据我所知,它没有使用文本框。我做错了什么

我已经在下面粘贴了我的XAML,删除了不相关的部分(菜单声明、模式等)


在使用默认名称空间之外的类型时,希望绕过类型名称的默认值转换器。您还希望使用由
GetType()
返回的类型名,而不是C编译器使用的类型名

首先,确保已声明引用
系统
命名空间的命名空间前缀,例如:

xmlns:sys="clr-namespace:System;assembly=mscorlib"
数据模板
中,使用
类型
标记扩展名引用类型:

DataType="{x:Type sys:Byte}"
编辑

下面是一个简单的工作示例:

<Window x:Class="ByteTemplateDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:ByteTemplateDemo="clr-namespace:ByteTemplateDemo" Title="MainWindow" Height="350" Width="525">
    <DockPanel>
        <DockPanel.Resources>
            <ByteTemplateDemo:ByteConverter x:Key="ByteConverter"/>
            <DataTemplate DataType="{x:Type sys:Byte}">
                <TextBox Foreground="Red" Text="{Binding Path=., Converter={StaticResource ByteConverter}}"/>
            </DataTemplate>
        </DockPanel.Resources>
        <ItemsControl x:Name="Items" ItemsSource="{Binding}"/>
    </DockPanel>
</Window>
在代码背后:

public MainWindow()
{
    InitializeComponent();
    ObservableCollection<byte> bytes = new ObservableCollection<byte>();
    bytes.Add(11);
    bytes.Add(12);
    bytes.Add(13);
    bytes.Add(14);
    Items.DataContext = bytes;
}
public主窗口()
{
初始化组件();
ObservableCollection字节=新的ObservableCollection();
字节。添加(11);
字节。添加(12);
字节。添加(13);
字节。添加(14);
Items.DataContext=字节;
}
这表明模板和值转换器都在使用中(因为您将在屏幕上看到以“b”开头的红色值文本框)


请注意,双向绑定在这个特定场景中无法工作,因为双向绑定需要属性名。为了进行双向绑定,您需要创建一个类,该类公开类型为
Byte
的命名属性,并绑定到这些对象的可观察集合。

当您使用默认命名空间之外的类型时,您希望绕过类型名的默认值转换器。您还希望使用由
GetType()
返回的类型名,而不是C编译器使用的类型名

首先,确保已声明引用
系统
命名空间的命名空间前缀,例如:

xmlns:sys="clr-namespace:System;assembly=mscorlib"
数据模板
中,使用
类型
标记扩展名引用类型:

DataType="{x:Type sys:Byte}"
编辑

下面是一个简单的工作示例:

<Window x:Class="ByteTemplateDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:ByteTemplateDemo="clr-namespace:ByteTemplateDemo" Title="MainWindow" Height="350" Width="525">
    <DockPanel>
        <DockPanel.Resources>
            <ByteTemplateDemo:ByteConverter x:Key="ByteConverter"/>
            <DataTemplate DataType="{x:Type sys:Byte}">
                <TextBox Foreground="Red" Text="{Binding Path=., Converter={StaticResource ByteConverter}}"/>
            </DataTemplate>
        </DockPanel.Resources>
        <ItemsControl x:Name="Items" ItemsSource="{Binding}"/>
    </DockPanel>
</Window>
在代码背后:

public MainWindow()
{
    InitializeComponent();
    ObservableCollection<byte> bytes = new ObservableCollection<byte>();
    bytes.Add(11);
    bytes.Add(12);
    bytes.Add(13);
    bytes.Add(14);
    Items.DataContext = bytes;
}
public主窗口()
{
初始化组件();
ObservableCollection字节=新的ObservableCollection();
字节。添加(11);
字节。添加(12);
字节。添加(13);
字节。添加(14);
Items.DataContext=字节;
}
这表明模板和值转换器都在使用中(因为您将在屏幕上看到以“b”开头的红色值文本框)


请注意,双向绑定在这个特定场景中无法工作,因为双向绑定需要属性名。为了进行双向绑定,您需要创建一个类,该类公开类型为
Byte
的命名属性,并绑定到这些对象的可观察集合。

Hm。我一读到您的答案就做了这两件事,但仍然不起作用。您的修订版做到了这一点,谢谢。据我所知,您的代码和我的代码之间唯一显著的区别是Path=。我不确定这会有什么影响,但一段时间对谷歌来说有点困难。我也不知道没有包装器类双向绑定不能工作,这也很有帮助。我一读到你的答案就做了这两件事,但它仍然不起作用。你的修订版成功了,谢谢。据我所知,您的代码和我的代码之间唯一显著的区别是Path=。我不确定这会有什么影响,但一段时间对谷歌来说有点困难。我也不知道没有包装器类双向绑定不能工作,这也很有帮助。