2017-06-28 57 views
1

類:使用祖先的ItemsSource在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> 

我已經嘗試了各種方法的RelativeSource,但不能讓它開始工作。

因爲我將List1中的名稱綁定爲ItemsSource,所以我無法在Expander中訪問List2中的Children或IsVisible。 我想知道它有可能從ItemsControl中的ListExample返回到示例元素。

+0

不確定你想在這裏實現什麼,一個itemsource需要一個項目和構建的列表如果您需要用於創建控件的項目,那麼它在dataDontext中(如果數據模板) – MikeT

+1

您需要提供要綁定到的類,因爲它們看起來不太清楚。 – Liero

+0

給我一分鐘,我會提供一個班級模型 – SireChicken

回答

1

你可以使用{RelativeSource}像這樣綁定到父ListViewDataContext

<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

這兩個答案的工作,我只是喜歡這個更好一點。 – SireChicken

1

給出以下型號:

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

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

它應該是這樣的:

<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

所以在List1中設置的ItemsSource適用於內部元素,但不適用於List1本身? – SireChicken

+0

我不明白你的問題。在最上面的ItemsControl中,這些項綁定到Example類。 List1 ListView中的項目綁定到字符串,因爲您將ItemsSource設置爲字符串列表。 – Liero

+0

這一切都很好,你只是讓我意識到一些事情 – SireChicken