2010-06-01 1 views
1

Я перерабатываю свой простой шестнадцатеричный редактор, чтобы практиковать, используя то, что я недавно узнал о привязке данных в WPF. Я не уверен, что я делаю неправильно здесь.Что я делаю неправильно с моим ItemsControl & databinding?

Как я понимаю, для каждого байта в коллекции «бэкэнд» (наследуется от 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}" 

Редактировать

Вот минимальный wo очий пример:

<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

Hm. Я сделал оба этих вопроса, как только прочитал ваш ответ, но он все еще не работает. – Joel

+0

Ваша пересмотренная версия делает трюк, спасибо. Насколько я могу судить, единственное существенное различие между вашим кодом и моим - это Path =. Я не уверен, что это такое, но для Google довольно сложно. Я также не знал о двухсторонней привязке, не работающей без класса-оболочки, что также очень помогает. – Joel

Смежные вопросы