2017-06-28 3 views
1

Klasse:Verwenden Vorfahr Itemssource in WPF

class ViewModel 
{ 
    public List<Example> ListExample { get; } 
} 
class Example 
{ 
    public List<string> Names { get; } 
    public Visibility IsVisible { get; } 
    public List<Example> Children { get; } 
} 

XAML:

<ItemsControl ItemsSource="{Binding ListExample}" 
       Name="Base"> 
    <ItemsControl.ItemTemplate> 
     ... 
     <ListView ItemsSource="{Binding Names}" 
       Name="List1"> 
      <ListView.ItemTemplate> 
       ... 
       <StackPanel> 
        <ContentPresenter Content="{Binding }"/> 
        <Expander Visibility="{Binding IsVisible}"> 
         <ListView ItemsSource="{Binding Children}" 
           Name="List2"> 
          ... 
         </ListView> 
        </Expander> 
       </StackPanel> 
      </ListView.ItemTemplate> 
     </ListView> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

ich verschiedene Ansätze Relative bereits versucht, konnte aber nicht an die Arbeit.

Da ich Namen in List1 als ItemsSource gebunden habe, kann ich im Expander nicht auf Children in List2 oder IsVisible zugreifen. Ich möchte wissen, ob es möglich ist, von ListExample im ItemsControl zurück zum Beispielelement zu gelangen.

+0

Nicht sicher, was Sie hier erreichen möchten, eine Itemsource nimmt eine Liste von Elementen und Builds eine Liste von Steuerelementen, von denen die Elementquelle keine Relevanz innerhalb des erstellten Elements hat, wenn das Element, das zum Erstellen des Steuerelements verwendet wurde, im dataDontext enthalten ist, wenn das Dataplate – MikeT

+1

Sie die Klassen angeben müssen, an die Sie gebunden sind. weil es nicht klar ist, wie sie aussehen. – Liero

+0

geben Sie mir eine Minute, ich werde ein Klassenmodell – SireChicken

Antwort

1

Sie zum DataContext des Mutter binden konnte ListView eine {RelativeSource} wie folgt aus:

<ItemsControl ItemsSource="{Binding ListExample}" Name="Base"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <ListView ItemsSource="{Binding Names}" Name="List1"> 
       <ListView.ItemTemplate> 
        <DataTemplate> 
         <StackPanel> 
          <ContentPresenter Content="{Binding}"/> 
          <Expander Visibility="{Binding DataContext.IsVisible, RelativeSource={RelativeSource AncestorType=ListView}}"> 
           <ListView ItemsSource="{Binding DataContext.Children, RelativeSource={RelativeSource AncestorType=ListView}}" Name="List2"> 
           </ListView> 
          </Expander> 
         </StackPanel> 
        </DataTemplate> 
       </ListView.ItemTemplate> 
      </ListView> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
+0

Beide Antworten funktionieren, ich mag es einfach ein bisschen besser. – SireChicken

1

gegeben folgende Modelle:

class ViewModel 
{ 
    public List<Example> Examples { get; } 
} 

class Example 
{ 
    public List<string> A {get;} 
    public Visibility B {get;} 
    public List<string> C {get;} 
} 

es würde wie folgt aussehen:

<ItemsControl ItemsSource="{Binding Examples}"> 
    <ItemsControl.ItemTemplate> 
     ... 
     <ListView ItemsSource="{Binding A}" 
       Name="List1"> 
      <ListView.ItemTemplate> 
       ... 
       <StackPanel> 
        <ContentPresenter Content="{Binding }"/> 
        <Expander Visibility="{Binding DataContext.B, ElementName=List1}"> 
         <ListView ItemsSource="{Binding DataContext.C, ElementName=List1}" 
           Name="List2"> 
          ... 
         </ListView> 
        </Expander> 
       </StackPanel> 
      </ListView.ItemTemplate> 
     </ListView> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
+0

zugreifen kann, so dass die ItemsSource in List1 für die inneren Elemente aber nicht List1 selbst gilt? – SireChicken

+0

Ich verstehe deine Frage nicht. Im obersten ItemsControl werden die Elemente an die Example-Klasse gebunden. Elemente in List1 ListView bindet an Zeichenfolge, da Sie ItemsSource auf Liste der Zeichenfolgen festlegen. – Liero

+0

Es ist alles gut, du hast mir gerade etwas einfallen lassen – SireChicken

Verwandte Themen