2011-08-14 7 views
2

私はWPFの初心者で、多分愚かな質問をします。しかしながら。さまざまなコントロールを生成するWPFバインディング

カスタムクラス(WidgetDescriptor)の派生クラス(MenuDescriptor、LabelDescriptor、ButtonDescriptor、SelectDescriptor)のツリーがあります。派生クラスは型固有のプロパティを提供します(SelectDescriptorはドロップダウンリストを記述し、ButtonDescriptorはTextとImageのプロパティを持ち、Itemsはプロパティを持ちます)。

WidgetDescriptorには、WidgetDescriptorインスタンスの観測可能なコレクションであるChildrenというプロパティがあります。

したがって、アプリケーションのメインメニューは、ButtonDescriptorインスタンスを葉として持つMenuDescriptorインスタンスのツリーです。ツールバーにはSelectDescriptor(ドロップダウンボックス)などが含まれている可能性があります。

バインディングを使用して、記述子タイプにWPFコントロールをマップすることは可能ですか? WPFがWidgetDescriptorの派生クラスの型をチェックして特定のコントロールを作成しますか?これらの階層的なことは、もちろんです。

答えて

1

あり、これはあなたのオブジェクトの種類に設定され、DataTemplateがオブジェクトの場合、それが自動的に使用されるキーなしResources辞書に配置されている場合は、このためのいくつかの組み込み機能は、すべてのDataTemplateは、DataTypeを持っていますその型はデータソースにエンコードされます。彼らはアイテムの子供たちのために内部ItemsSourceを提供し、木のため

<Menu ItemsSource="{Binding RootList}"> 
    <Menu.Resources> 
     <HierarchicalDataTemplate DataType="{x:Type obj:MenuDescriptor}" 
       ItemsSource="{Binding Children}"> 
      <!-- ... --> 
     </HierarchicalDataTemplate> 
     <DataTemplate DataType="{x:Type obj:ButtonDescriptor}"> 
      <!-- ... --> 
     </DataTemplate> 
     <!-- ... --> 
    </Menu.Resources> 
</Menu> 

使用hierarhicalもの:

は、あなたのメニューのためには、したがって、単にテンプレートの束を作成することができます。しかし、メニューツリーに複数のクラスを持たせるのは冗長なようですが、リーフはちょうどMenuDescriptorsでも構いません(普通のMenuItemsの場合のように)。

関連する問題