2010-06-01 67 views
1

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

据我所知,对于集合“backend”(从ObservableCollection继承)中的每个字节,我的ItemsControl应该在资源下应用DataTemplate。这个模板只是一个绑定到值转换器的文本框。所以我期待看到一排文本框,每个文本框都包含一个字节的字符串表示。当我使用这个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> 

回答

4

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

首先,确保你已经声明了一个命名空间前缀引用System命名空间,如:

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

而在你DataTemplate,使用Type标记扩展引用类型:

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

编辑

这是最小的窝rking例如:

<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”开头)。

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

+0

嗯。我一读完你的答案,我就做了这两个,但它仍然无法正常工作。 – Joel 2010-06-01 21:19:21

+0

您的修订版本会诀窍,谢谢。尽我所知,您的代码和我的代码之间唯一重要的区别是Path =。我不确定那是干什么的,谷歌这段时间有点困难。我也不知道如果没有包装类,双向绑定不起作用,这也有很大帮助。 – Joel 2010-06-03 00:55:39