2017-06-28 12 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としてバインドして以来、私はList2の子にも、ExpanderのIsVisibleにもアクセスできません。 ItemsControlのListExampleからExample Elementに戻ることができるかどうかを知りたいと思います。モデル次与え

+0

あなたがここで達成しようとしていることを確認していない、itemsourceはアイテムとビルドのリストを取るそこからコントロールのリストが作成されたアイテム内では関連性がなく、コントロールを作成するために使用されたアイテムが必要な場合は、dataDontextデータテンプレートの場合 – MikeT

+1

バインドするクラスを指定する必要があります。彼らの見た目がはっきりしないからです。 – Liero

+0

私に1分を教えてください、私はクラスモデル – 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

両方の答えが働く、私はちょうどこの1つ少し良いが好きです。 – 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クラスにバインドされます。 ItemSourceを文字列のリストに設定するため、List1の項目はListにバインドされます。 – Liero

+0

それはすべていいです、あなたはただ私に何かを実現させました – SireChicken

関連する問題