2010-06-01 68 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