2010-06-01 1 views
1

Je suis en train de retravailler mon simple éditeur hexadécimal pour m'entraîner à utiliser ce que j'ai appris récemment sur la liaison de données dans WPF. Je ne suis pas sûr de ce que je fais mal ici. Si je comprends bien, pour chaque octet de la collection "backend" (hérite de ObservableCollection), mon ItemsControl devrait appliquer le DataTemplate sous les ressources. Ce modèle est juste une zone de texte avec une liaison à un convertisseur de valeur. Je m'attends donc à voir une rangée de zones de texte contenant chacune une représentation sous forme de chaîne d'un octet. Quand j'utilise ce XAML, tout ce que je reçois est une seule ligne de texte non éditable, ce qui, pour autant que je sache, n'utilise pas de zone de texte. Qu'est-ce que je fais mal?Qu'est-ce que je fais de mal avec mes ItemsControl & databinding?

J'ai collé mon code XAML ci-dessous, avec les parties non pertinentes (déclaration de menu, schéma, etc.) supprimées.

<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> 

Répondre

4

Vous souhaitez ignorer le convertisseur de valeur par défaut pour les noms de type lorsque vous utilisez des types en dehors de l'espace de noms par défaut. Et vous voulez également utiliser le nom de type qui est retourné par GetType(), pas le nom de type que le compilateur C# utilise.

d'abord, assurez-vous que vous avez déclaré un préfixe d'espace de nom qui fait référence à l'espace de noms System, par exemple:

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

Et dans votre DataTemplate, la référence du type en utilisant l'extension de balisage Type:

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

Modifier

Voici un wo minimal exemple 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> 

Le convertisseur de valeur:

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; 
    } 
} 

Et dans le code-behind:

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

Cela démontre que le modèle et le convertisseur de valeur sont tous deux employés (depuis vous verrez des zones de texte avec des valeurs rouges qui commencent par "b" sur l'écran).

Notez que la liaison bidirectionnelle ne peut pas fonctionner dans ce scénario particulier, car la liaison bidirectionnelle requiert un nom de propriété. Pour effectuer une liaison bidirectionnelle, vous devez créer une classe qui expose une propriété nommée de type Byte et lier à une collection observable de ces objets.

+0

Hm. J'ai fait les deux dès que j'ai lu votre réponse, mais ça ne marche toujours pas. – Joel

+0

Votre version révisée fait l'affaire, merci. Le mieux que je puisse dire, la seule différence significative entre votre code et le mien est le chemin =. Je ne suis pas certain de ce que cela fait, une période est un peu difficile à google. Je ne savais pas non plus que la liaison bidirectionnelle ne fonctionne pas sans une classe d'emballage, ce qui aide beaucoup. – Joel

Questions connexes