2

ItemsControlコレクションにバインドされた があり、 を指定してHierarchicalDataTemplateアイテムをレンダリングします。個々のアイテムのレンダリングが慎重になるため、テンプレート セレクターも取得しました。何らかの理由でこれは機能しません。

以下はコードの抜粋です。助けてもらえますか? 次の階層からアイテムをレンダリングしようとしています Parent->Child Collection->SubChildCollection (以下のコードのように)。

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:WpfApplication2="clr-namespace:WpfApplication2" Title="MainWindow" Height="350" Width="525">
    <Window.Resources>

        <DataTemplate x:Key="EntityItemTemplate" DataType="{x:Type WpfApplication2:EntityItem}">
            <TextBlock Text="{Binding Name}"/>
        </DataTemplate>
        <WpfApplication2:TemplateSelector x:Key="ts" EntityItemTemplate="{StaticResource EntityItemTemplate}"/>        
        <HierarchicalDataTemplate x:Key="hdt" DataType="{x:Type WpfApplication2:EntityGroup}" ItemsSource="{Binding Path=EntityItems}" ItemTemplateSelector="{StaticResource ts}"/>
    </Window.Resources>

    <Grid>

        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <ItemsControl Grid.Row="0" ItemsSource="{Binding Path=Entity.EntityGroups}" ItemTemplate="{StaticResource hdt}"></ItemsControl>
    </Grid>
</Window>

public partial class MainWindow : Window
    {
        ViewModel vm = new ViewModel();
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = vm;
            vm.Entity = new Entity()
                            {
                                Name = "abc",
                                EntityGroups = new ObservableCollection<EntityGroup>()
                                                   {
                                                       new EntityGroup()
                                                           {
                                                               EntityItems = new ObservableCollection<EntityItem>()
                                                                                 {
                                                                                     new EntityItem() {Name = "Entity1"},
                                                                                     new EntityItem() {Name = "Entity2"}
                                                                                 }
                                                           }
                                                   }
                            };
        }

    }

    public class TemplateSelector:DataTemplateSelector
    {
        public DataTemplate EntityItemTemplate { get; set; }

        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            if (item == null || !(item is EntityItem))
                return base.SelectTemplate(item, container);

            return EntityItemTemplate;
        }
    }

    public class ViewModel:NotificationObject
    {
        private Entity _entity;
        public Entity Entity
        {
            get { return _entity; }
            set
            {
                _entity = value;
                RaisePropertyChanged(() => Entity); 
            }
        }
    }

    public class Entity:NotificationObject
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                RaisePropertyChanged(() => Name);   
            }
        }

        private ObservableCollection<EntityGroup> _entityGroups;
        public ObservableCollection<EntityGroup> EntityGroups
        {
            get { return _entityGroups; }
            set
            {
                _entityGroups = value;
                RaisePropertyChanged(() => EntityGroups);   
            }
        }
    }

    public class EntityGroup:NotificationObject
    {
        public string Name { get; set; }

        private ObservableCollection<EntityItem> _entityItems;
        public ObservableCollection<EntityItem> EntityItems
        {
            get { return _entityItems; }
            set
            {
                _entityItems = value;
                RaisePropertyChanged(() => EntityItems);    
            }
        }
    }

    public class EntityItem:NotificationObject
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                RaisePropertyChanged(() => Name);   
            }
        }
    }
4

1 に答える 1

4

で使用しているためItemsControl、 を使用しないでくださいHierarchicalDataTemplateMSDNが述べているようにHierarchicalDataTemplate

TreeViewItem や MenuItem などの HeaderedItemsControl をサポートする DataTemplate を表します。

AnItemsControlは、そのデータを a 内に表示しますContentPresenter。ATreeViewは を生成TreeViewItemsし、aMenuは を生成しMenuItemsます。

DataTemplateSelector内のアイテムのさまざまなテンプレートを表示するために を使用する場合はItemsControl、 として直接設定するだけItemTemplateSelectorです。

<ItemsControl ItemsSource="{Binding Path=Entity.EntityGroups}" 
              ItemTemplateSelector="{StaticResource ts}" />

データの階層表示が必要な場合は、次を使用しますTreeView

<TreeView ItemsSource="{Binding Path=Entity.EntityGroups}" 
          ItemTemplate="{StaticResource hdt}" />
于 2013-07-05T20:21:30.810 に答える