2010-07-21 26 views
13

Ben böyle bir sınıfı bir şey var: başka bir sınıfta bulunanÖzyineli DataTemplates mümkün mü?

public class Section 
{ 
    private IEnumerable<Section> sections; 
    private IEnumerable<KeyValuePair<string, string>> attributes 

    public string Name {get;set;} 
    public IEnumerable<Section> Sections 
    { 
     get {return sections;} 
    } 
    public IEnumerable<KeyValuePair<string, string>> Attributes 
    { 
     get {return attributes;} 
    } 

    public Section(...) 
    { 
     //constructor logic 
    } 
} 

, etrafında sarar ve bir ObjectDataProvider WPF kullanılan Tartışmanın iyiliği için OtherClass arama sağlar. Görebildiğiniz gibi, Section örneğinin bir örneği, Section'un diğer birçok örneğini içerebilir.

Bu yinelemeyle ilgilenen bir şablon oluşturmak için XAML'de bir yol var mı?

<UserControl x:Class="OtherClassEditor" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:OtherClassNS="clr-namespace:NameSpace" 
    Height="300" Width="300"> 
    <UserControl.Resources> 
     <ObjectDataProvider ObjectType="{x:Type OtherClassNS:OtherClass}" x:Key="ViewModel" /> 
     <DataTemplate x:Key="listViewAttr"> 
      <WrapPanel> 
       <TextBlock Text="{Binding Path=Key}"></TextBlock><TextBlock Margin="0,0,4,0">: </TextBlock> 
       <TextBlock Text="{Binding Path=Value}"></TextBlock> 
      </WrapPanel> 
     </DataTemplate> 
     <DataTemplate x:Key="listViewSection"> 
      <StackPanel> 
       <WrapPanel Margin="0,0,0,8"> 
        <TextBlock Margin="0,0,4,0">Section:</TextBlock> 
        <TextBlock Text="{Binding Path=Name}"/> 
       </WrapPanel> 
      </StackPanel> 
     </DataTemplate> 
     <DataTemplate x:Key="listViewData"> 
      <StackPanel> 
       <WrapPanel Margin="0,0,0,8"> 
        <TextBlock Margin="0,0,4,0">Section: </TextBlock> 
        <TextBlock Text="{Binding Path=Name}"/> 
        <ListView DataContext="{Binding Path=Sections}" ItemTemplate="{StaticResource listViewSection}" ItemsSource="{Binding Sections}"> 
        </ListView> 
        <ListView DataContext="{Binding Path=Attributes}" ItemsSource="{Binding Attributes}" ItemTemplate="{StaticResource listViewAttr}"> 

        </ListView> 
       </WrapPanel> 
      </StackPanel>  
     </DataTemplate> 
    </UserControl.Resources> 
    <Grid> 
     <ListView DataContext="{StaticResource ViewModel}" ItemTemplate="{StaticResource listViewData}" ItemsSource="{Binding Sections}"> 
     </ListView> 
    </Grid> 
</UserControl> 

Ama DataTemplate sadece ondan önce bildirilmiş bir referans alabilir gibi Özyinelemeyi alamayan:

Bu defa ne var olduğunu.

Bu XAML'de yapılabilir mi? Öyleyse nasıl? Bu kod arkasında yapmam gereken bir şey mi?

DataTemplates yoldayken bile mi? Bu verileri görüntülemek ve düzenlemek için daha iyi bir yol var mı?

+3

StaticResource yerine DynamicResource kullanırsanız bu işe yarar mı? Çalışırsa ilginç olurdu, ancak şablon sonsuz bir tekrarlamaya neden olursa ne olacağını görmek istemem. –

+0

Bunu düşünmemiştim! İşe yaramıyor, ama ben HierarchicalDataTemplate'ın görünümünü seviyorum. Amaca daha uygun görünüyor. –

cevap

2

Belki de sizin senaryoyu yanlış anlamıyorum, ancak aradığınız HierarchicalDataTemplate nedir?

+0

Bahşiş için teşekkürler, şimdi üzerinde okuma yapıyorum. –

+0

HierarchicalDataTemplate yalnızca TreeView ve MenuItem ile çalışır. Bunun neden kabul edilen cevap olduğunu bilmiyorum. –

22

durumda herkes bir HierarchicalDataTemplate kullanmadan bunu nasıl görmesi gerekiyor:

<UserControl x:Class="OtherClassEditor" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:OtherClassNS="clr-namespace:NameSpace" 
    Height="300" Width="300"> 
    <UserControl.Resources> 
     <ObjectDataProvider ObjectType="{x:Type OtherClassNS:OtherClass}" x:Key="ViewModel" /> 
     <DataTemplate x:Key="listViewAttr"> 
      <WrapPanel> 
       <TextBlock Text="{Binding Path=Key}"></TextBlock> 
       <TextBlock Margin="0,0,4,0">: </TextBlock> 
       <TextBlock Text="{Binding Path=Value}"></TextBlock> 
      </WrapPanel> 
     </DataTemplate> 
     <DataTemplate x:Key="listViewData"> 
      <StackPanel> 
       <WrapPanel Margin="0,0,0,8"> 
        <TextBlock Margin="0,0,4,0">Section: </TextBlock> 
        <TextBlock Text="{Binding Path=Name}"/> 
       </WrapPanel> 
       <ListView ItemTemplate="{DynamicResource listViewData}" ItemsSource="{Binding Sections}" /> 
       <ListView ItemsSource="{Binding Attributes}" ItemTemplate="{StaticResource listViewAttr}" /> 
      </StackPanel>  
     </DataTemplate> 
    </UserControl.Resources> 
    <Grid> 
     <ListView DataContext="{StaticResource ViewModel}" ItemTemplate="{DynamicResource listViewData}" ItemsSource="{Binding Sections}"> 
     </ListView> 
    </Grid> 
</UserControl> 

Bu ne istiyorum temelde beni alır.

Ana değişiklik, Dan Bryant'ın önerdiği gibidir: ItemTemplate'u, yineleme nesnesi (Section) için statik kaynak yerine bir Dinamik kullanmak için değiştirme.