WPF: ItemsControl und der DataContext
Ich habe ein Hauptfenster mit einem Benutzer-Steuerelement, genannt SuperMode
. SuperMode
besteht aus einer Sammlung von Personen, und jede person, die in dieser Sammlung hat Ihre eigene Sammlung von Aufgaben. Klingt einfach, nicht wahr?
Aus der Datei SuperMode.xaml
:
<UserControl
x:Class="Prototype.SuperMode"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Prototype"
DataContext="{Binding RelativeSource={RelativeSource Self}}"> <!-- NOTE! -->
<!-- Look at how I'm setting the DataContext, as I think it's
important to solve the problem! -->
<ScrollViewer CanContentScroll="True">
<ItemsControl ItemsSource="{Binding People}" Margin="1">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Rows="1"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</ScrollViewer>
</UserControl>
Diese funktioniert einwandfrei und ich kann sehen vier Menschen, als ich erwarte! Alles was ich jetzt noch tun müssen, ist der XAML-Recht für die Person
Benutzer Steuern, so dass alle Ihre Aufgaben werden ebenfalls angezeigt.
Wie Sie sehen können, bin ich mit dem People
- Eigenschaft für das Steuerelement Auffüllen mit Gegenständen. Die People
Eigenschaft hat den Typ ObservableCollection<Person>
, wo Person
ist ein anderer Benutzer die Kontrolle als solche...
Vom Person.xaml
:
<UserControl
x:Class="Prototype.Person"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Prototype">
<Border Background="Black" CornerRadius="4" Margin="1">
<ItemsControl ItemsSource="{Binding Tasks}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Border>
</UserControl>
Tasks
hier ist eine Eigenschaft, die Person
mit Typ -ObservableCollection<Task>
. Dies ist, wo es klemmt! Offenbar WPF finde keine Tasks
Eigenschaft und suchen Sie sich das Ausgabefenster von VS2008, finde ich folgende:
System.Windows.Datenfehler: 39 : BindingExpression Pfad-Fehler: 'Aufgaben' - Eigenschaft nicht auf "Objekt" "SuperMode' (Name= "SuperMode')'. BindingExpression:Path=Aufgaben; DataItem='SuperMode' (Name= "SuperMode'); target element is 'ItemsControl' (Name="); target property is 'ItemsSource "' (Typ 'IEnumerable')
Nun bin ich verloren. Es scheint, dass ich habe die DataContext
- Attribut auf jeder Person
, sonst wird es denke immer noch, dass die Daten Kontext ist SuperMode
, aber wie mache ich das?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ignorieren die eher unangenehme design, die Sie haben (Sie sollten in MVVM), sollten Sie in der Lage sein, die
DataContext
für das KindUserControl
s wie folgt: