c# - 我的 ItemsControl 和数据绑定(bind)有什么问题?

标签 c# wpf data-binding datatemplate itemscontrol

我正在修改我的简单十六进制编辑器,以练习使用我最近学到的有关 WPF 数据绑定(bind)的知识。我不确定我在这里做错了什么。

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

我在下面粘贴了我的 XAML,删除了不相关的部分(菜单声明、架构等)。

<Window ...>
        <Window.Resources>
            <local:Backend x:Key="backend" />
            <local:ByteConverter x:Key="byteConverter" />
            <DataTemplate DataType="byte">
                <TextBox Text="{Binding Converter={StaticResource byteConverter}}" />                    
            </DataTemplate>
        </Window.Resources>
        <StackPanel>
            <ItemsControl ItemsSource="{Binding Source={StaticResource backend}}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapPanel />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
        </StackPanel>
    </Window>

最佳答案

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

首先,确保您已经声明了引用 System 命名空间的命名空间前缀,例如:

xmlns:sys="clr-namespace:System;assembly=mscorlib"

在您的 DataTemplate 中,使用 Type 标记扩展引用类型:

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 class ByteConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Byte b = (Byte)value;
        return "b" + b.ToString();
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string strValue = value as string;
        Byte result;
        if (Byte.TryParse(strValue, out result))
        {
            return result;
        }
        return DependencyProperty.UnsetValue;
    }
}

在代码隐藏中:

public MainWindow()
{
    InitializeComponent();
    ObservableCollection<byte> bytes = new ObservableCollection<byte>();
    bytes.Add(11);
    bytes.Add(12);
    bytes.Add(13);
    bytes.Add(14);
    Items.DataContext = bytes;
}

这表明模板和值转换器都在使用(因为您会在屏幕上看到带有以“b”开头的红色值的文本框)。

请注意,双向绑定(bind)在这种特定情况下不起作用,因为双向绑定(bind)需要属性名称。为了进行双向绑定(bind),您需要创建一个公开类型为 Byte 的命名属性的类,并绑定(bind)到这些对象的可观察集合。

关于c# - 我的 ItemsControl 和数据绑定(bind)有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2952582/

相关文章:

c# - 从 Fortify sourceanalyzer 命令行获取文本输出

c# - 以 DataGrid 作为左侧组件的 GridSplitter

c# - 使用 x :Bind? 时,UpdateSourceTrigger=PropertyChanged 的​​等效项是什么

javascript - Knockout - 将用户输入添加到表中时出现问题

c# - $.post 不适用于本地部署的站点

c# - 检查数据集的最佳方法有记录

c# - 可以重复 XAML block ,foreach 样式吗?

wpf - 为所有控件设置 VerticalAlignment 属性

c# - 为什么我的带有 DispatcherTimer 的简单 wpf C# 应用程序出现内存泄漏?

javascript - 数据表行选择的 Angular 数据绑定(bind)