ItemsControl ItemTemplate Binding
n WPF4.0 habe ich eine Klasse, die andere Klassentypen als Eigenschaften enthält (Kombination mehrerer Datentypen für die Anzeige). Etwas wie
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; }
}
In meinem Fenster habe ich ein ItemsControl mit den folgenden Angaben (aus Gründen der Übersichtlichkeit abgeschnitten):
<ItemsControl ItemsSource={Binding}>
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:MyDisplayControl
OwnerName={Binding OwnerData.OwnerName}
Credit={Binding Credit} />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Ich erhalte dann eine Sammlung von Anzeigeinformationen von der Datenschicht und setze dasDataContext
desItemsControl
zu dieser Sammlung. Die "Credit" -Eigenschaft wird korrekt angezeigt, die OwnerName -Eigenschaft jedoch nicht. Stattdessen erhalte ich einen Bindungsfehler:
Fehler 40: BindingExpression-Pfadfehler: Die Eigenschaft 'OwnerName' wurde für 'object' '' ForDisplay '(HashCode = 449124874)' nicht gefunden. BindingExpression: Path = OwnerName; DataItem = 'ForDisplay' (HashCode = 449124874); Zielelement ist 'TextBlock' (Name = txtOwnerName '); Zieleigenschaft ist 'Text' (Typ 'String')
Ich verstehe nicht, warum versucht wird, in der ForDisplay-Klasse nach der OwnerName-Eigenschaft zu suchen, und nicht in der Owner-Klasse aus der ForDisplay-OwnerData-Eigenschaft.
Bearbeite Es hat anscheinend etwas mit der Verwendung des benutzerdefinierten Steuerelements zu tun. Wenn ich die gleichen Eigenschaften an ein @ binTextBlock
, sie funktionieren korrekt.
<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>