2012-04-07 10 views
1

Ich habe ein DataGrid innerhalb der ItemTemplate einer ListBox geschachtelt. Ich versuche, eine baumähnliche Datenstruktur damit anzuzeigen. Meine Klassen sind wie folgt. Das Objekt in meinem Datenkontext enthält ein List<Section> namens Sections, an das meine ListBox gebunden ist. Jede Section enthält eine List<Item> namens Items, an die das DataGrid in eac ItemTemplate gebunden ist.Verschachteltes Datagrid in ListBox

Wenn ich die App ausführen, bekomme ich eine Null-Referenz Ausnahme von der XAML an der Zeile mit der Bindung. Gibt es einen besseren/alternativen Weg dies zu tun, oder fehlt mir ein Trick mit der Bindung?

<Window.Resources> 
    <CollectionViewSource x:Key="SectionSource" /><!-- this is initialized and filled with an ObservableCollection<Section> Sections when the window loads--> 
</Window.Resources> 

<ListBox x:Name="lstIngredients" ItemsSource="{Binding Source={StaticResource SectionSource}}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <DataTemplate.Resources> 
       <CollectionViewSource x:Key="itemsSource" Source="{Binding Items}"/> 
      </DataTemplate.Resources> 

<DataGrid x:Name="dgItems" IsReadOnly="false" AutoGenerateColumns="False" SelectionMode="Single" SelectionUnit="FullRow" IsSynchronizedWithCurrentItem="True" 
    DataContext="{Binding}" 
    ItemsSource="{Binding Source={StaticResource Items}}" 
    EnableRowVirtualization="false" 
    VirtualizingStackPanel.VirtualizationMode="Standard" 
     <DataGrid.Columns> 
<DataGridTemplateColumn Width="2*" Header="{lex:LocText ChickenPing.Shared:Strings:Measurement}"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <TextBlock x:Name="quantity" Text="{Binding Measurement}" TextTrimming="CharacterEllipsis" TextAlignment="Left"/> 
        <!-- Null reference on this line caused by the binding. If I set this to any DependencyProperty on an Item object, I get a null reference--> 
       </DataTemplate> 

Antwort

0

ich dies schließlich aufgespürt zu einem Ereignis sein, die in einem der Templatecolumns festgelegt wurde. Umschalten der Veranstaltung von

<TextBlock x:Name="quantity" Text="{Binding Measurement}" GotFocus="txt_GotFocus" />

zu

<Style x:Key="FocusableTextbox" TargetType="{x:Type TextBox}"> 
    <EventSetter Event="GotFocus" Handler="txt_GotFocus" /> 
</Style> 
... 
<TextBlock x:Name="quantity" Text="{Binding Measurement}" Style={StaticResource FocusableTextbox} /> 
0

Dieser Bedarf Weg

ItemsSource="{Binding Source={StaticResource Items}}" 

ItemsSource="{Binding Path=PropertyThatIsCollection}" 

und löschen Sie die Datacontext Linie

+0

gleichen Fehler leider. Für die TextBox-Textbindung habe ich '{Binding DataContext.MyProperty}' und '{Binding MyProperty}' versucht, aber beides funktioniert nicht. – Echilon

+0

Beginnen wir mit der Sammlung. Setzen Sie ein Debug in das Get on "{Binding Path = PropertyThatIsCollection}" und stellen Sie sicher, dass die Auflistung aufgerufen wird. Dasselbe gilt für TextBlock Path =, da die Bindung relativ ist. Sie können PresentationTrace High verwenden, um mehr Bindungsfehler zu erhalten. – Paparazzi