/ / ItemsControl ItemTemplate Liaison - wpf, liaison, .net-4.0, itemscontrol, itemtemplate

Liaison ItemsControl ItemTemplate - wpf, liaison, .net-4.0, itemscontrol, itemtemplate

Dans WPF4.0, j'ai une classe qui contient d'autres types de classe en tant que propriétés (combinant plusieurs types de données pour l'affichage). Quelque chose comme:

public partial class Owner
{
public string OwnerName { get; set; }
public int    OwnerId   { get; set; }
}

partial class ForDisplay
{
public Owner OwnerData { get; set; }
public int Credit { get; set; }
}

Dans ma fenêtre, j'ai un ItemsControl avec les éléments suivants (clippés pour plus de clarté):

<ItemsControl ItemsSource={Binding}>
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:MyDisplayControl
OwnerName={Binding OwnerData.OwnerName}
Credit={Binding Credit} />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

Je récupère ensuite une collection d’informations d’affichage à partir de la couche de données et DataContext du ItemsControl à cette collection. La propriété "Crédit" est affichée correctement, mais pas la propriété OwnerName. Au lieu de cela, j'obtiens une erreur de liaison:

Erreur 40: chemin BindingExpression Erreur: Propriété "OwnerName" non trouvée sur "objet" "" ForDisplay " (HashCode = 449124874) ". BindingExpression: Path = OwnerName; DataItem = "ForDisplay" (HashCode = 449124874); élément cible est "TextBlock" (Name = txtOwnerName "); propriété cible est "Texte" (type "Chaîne")

Je ne comprends pas pourquoi cela tente de rechercher la propriété OwnerName dans la classe ForDisplay, plutôt que dans la classe Owner à partir de la propriété ForDisplay OwnerData.

modifier Il semble que cela ait quelque chose à voir avec l'utilisation du contrôle personnalisé. Si je lie les mêmes propriétés à un TextBlock, ils fonctionnent correctement.

<ItemsControl ItemsSource={Binding}>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<local:MyDisplayControl
OwnerName={Binding OwnerData.OwnerName}
Credit={Binding Credit} />
<TextBlock Text="{Binding OwnerData.OwnerName}" />
<TextBlock Text="{Binding Credit}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

Réponses:

7 pour la réponse № 1

Etes-vous sûr que le code que vous avez posté ici EST le code que vous utilisez dans votre solution? Parce que ce code fonctionne pour moi:

XAML

<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding OwnerData.OwnerName}"></TextBlock>
<TextBlock Text="{Binding Credit}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

Fenêtre "événement chargé

ObservableCollection<ForDisplay> items = new ObservableCollection<ForDisplay>();

for (int i = 0; i < 10; i++)
{
items.Add(new ForDisplay() { OwnerData = new Owner() { OwnerId = i + 1, OwnerName = String.Format("Owner #{0}", i + 1) }, Credit = i + 1 });
}

DataContext = items;