WP7 - ListBox Bindung an verschachtelten ObservableCollection

Ich habe eine ObservableCollection von Objekten wie folgt:

public class UserDataViewModel
{
  private ObservableCollection<CategoryItem> _data = 
                                       new ObservableCollection<CategoryItem>();

  public ObservableCollection<CategoryItem> Data
  {
    get { return _data; }
    private set { }
  }
  //Other methods to set Data
}

Den CategoryItem Klasse ist definiert als:

public class CategoryItem : INotifyPropertyChanged
{
  private string _name = null;
  private ObservableCollection<EntryItem> _entries = 
                                 new ObservableCollection<EntryItem>();

  public string Name
  {
    get { return _name; }
    set {
      if( value != _name ) {
        _name = value;
        NotifyPropertyChanged( "Name" );
      }
    }
  }

  public ObservableCollection<EntryItem> Entries
  {
    get { return _entries; }
    set {
      if( value != _entries ) {
        _entries = value;
        NotifyPropertyChanged( "Entries" );
      }
    }
  }
  //INotifyPropertyChanged code follows
}

Den EntryItem Klasse ist definiert als:

public class EntryItem : INotifyPropertyChanged
{
  private string _name = null;

  public string Name
  {
    get { return _name; }
    set {
      if( value != _name ) {
        _name = value;
        NotifyPropertyChanged( "Name" );
      }
    }
  }
  //INotifyPropertyChanged code follows
}

Ich versuche, binden diese zu einem ListBox. Jeder ListBoxItem besteht aus 2 TextBlocks. Ich will die erste TextBlock zur Anzeige der EntryItem.Name - Eigenschaft und der zweite für die Anzeige der CategoryItem.Name Eigenschaft. Hier ist, was ich versucht habe in XAML (ohne Erfolg):

<ListBox x:Name="MyListBox"
         Margin="0,0,-12,0"
         ItemsSource="{Binding Data}">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <StackPanel Margin="0,0,0,17">
        <!--This should display EntryItem.Name-->
        <TextBlock Text="{Binding Entries.Name}"
                   TextWrapping="Wrap"
                   Margin="12,0,0,0"
                   Style="{StaticResource PhoneTextExtraLargeStyle}" />

        <!--This should display CategoryItem.Name-->
        <TextBlock Text="{Binding Name}"
                   TextWrapping="Wrap"
                   Margin="12,-6,0,0"
                   Style="{StaticResource PhoneTextSubtleStyle}" />
      </StackPanel>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

In der code-behind für diese Seite bin ich-Einstellung:

DataContext = App.ViewModel; //ViewModel is of type UserDataViewModel

Bekomme ich immer wieder die binding-Fehler:

System.Windows.Data Error: BindingExpression path error: 'Name' property not found on 'System.Collections.ObjectModel.ObservableCollection`1[NestedCollection.ViewModels.EntryItem]' 'System.Collections.ObjectModel.ObservableCollection`1[NestedCollection.ViewModels.EntryItem]' (HashCode=123081170). BindingExpression: Path='Entries.Name' DataItem='NestedCollection.ViewModels.CategoryItem' (HashCode=121425257); target element is 'System.Windows.Controls.TextBlock' (Name=''); target property is 'Text' (type 'System.String')..

NestedCollection ist der name dieses Projekts und aller oben genannten Klassen sind in der NestedCollection.ViewModels namespace.

Nur den Inhalt der zweiten TextBlock angezeigt werden. Wie kann ich dieses Problem beheben?

Danke für deine Hilfe, das hat mich verrückt für ein paar Stunden jetzt!

EDIT:

Angenommen, die Data Sammlung enthält 2 Einträge, "Credit Cards" und "E-Mail-Konten" (diese sind Name Eigenschaft jedes CategoryItem Objekt in der Sammlung. Sagen, der erste CategoryItem hat die EntryItem Objekte "Visa", "Mastercard" und "American Express", und die zweite CategoryItem Objekt hat EntryItem Objekte "Google Mail" und "Hotmail", dann möchte ich die ListBox anzeigen:

Visa
Credit Cards

Mastercard
Credit Cards

American Express
Credit Cards

GMail
Email Accounts

Hotmail
Email Accounts

Merke ich, dass der Entries Eigenschaft von Data keinen Name Eigenschaft, jeden Eintrag innerhalb es spielt. Es ist trotzdem ein index in die Entries im XAML binden?

InformationsquelleAutor Praetorian | 2011-01-07
Schreibe einen Kommentar