2016-12-30 13 views
0

のリストにバインドされたTreeViewがあります。 TilesetTileGroupを含み、TileGroupTileTileRunの両方のインスタンスを含みます。 TileTileRunITileを実装するが、結局そこに、私は以下のXAML持っITileWPFでの自動テンプレート選択がインターフェイスで動作しない

を実施し、より多くの種類になります両方:

<TreeView 
    Grid.Row="0" 
    Grid.Column="0" 
    BorderThickness="0" 
    ItemsSource="{Binding Path=Tilesets}"> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate DataType="{x:Type local:Tileset}" ItemsSource="{Binding Path=TileGroups}"> 
      <TextBlock Text="{Binding Path=Name}" /> 
     </HierarchicalDataTemplate> 
     <HierarchicalDataTemplate DataType="{x:Type local:TileGroup}" ItemsSource="{Binding Path=Tiles}"> 
      <TextBlock Text="{Binding Path=Name}" /> 
     </HierarchicalDataTemplate> 
     <DataTemplate DataType="{x:Type tiles:ITile}"> 
      <TextBlock Text="{Binding Path=Name}" /> 
     </DataTemplate> 
    </TreeView.Resources> 
</TreeView> 

TilesetをしてTileGroupDataTemplate正しいが、ITileを選択することは、何のテンプレートが選択されていないいません、ツリーにはデータタイプが表示されます。私は明示的に両方TileTileRunためDataTemplateを追加する場合

しかし、すべてが最終的にITileを実装し、より多くのクラスがあるだろうとして、それにもかかわらず行うにはしたくないgreat.I動作します。

私はDataTemplateSelectorを使用してこれを処理できることを知っていますが、可能であれば純粋なXAMLソリューションが必要です。

ここで何か間違っているのですか、WPFはインターフェイスに基づいてこのタイプの自動テンプレート選択をサポートしていませんか?

+0

が重複する可能性を[インターフェイスへのWPFデータバインディングと実際のオブジェクトのキャストはできませんか?](https://stackoverflow.com/questions/327984/wpf-databinding-to-interface-and-not-actual-object-casting-possible) –

答えて

2

私はここで何か間違っているのですか、WPFはインターフェイスに基づいてこのタイプの自動テンプレート選択をサポートしていませんか?

あなたは何か間違っていません。このようなインタフェースのデータバインディングサポートは、単にサポートされていません。理由の詳細については、MSDNフォーラムの次のスレッドのBeatriz Costa(MSFT)の回答を参照してください。

データテンプレートおよびインタフェース:https://social.msdn.microsoft.com/Forums/vstudio/en-US/1e774a24-0deb-4acd-a719-32abd847041d/data-templates-and-interfaces?forum=wpf

「チームをデータバインディングはしばらく前のインターフェイスのための追加支援を検討したが、我々はそれのために良いデザインを考え出すことができなかったので、それを実装しないことになりました。あなたのデータソースがIMyInterface1とIMyInterface2の両方を実装していて、リソース内の両方のインタフェース用のDataTemplatesを持っているというシナリオを考えてみましょう。DataTemplateはどのデータピックアップを受け入れるべきだと思いますか?

オブジェクト型の暗黙的なデータテンプレートを作成するときは、最初に正確な型、親、祖父母などのDataTemplateを見つけようとします。私たちが適用するタイプの順序は非常に明確に定義されています。インターフェースのサポートの追加について話をしたところ、リフレクションを使用してすべてのインターフェースを見つけ出し、それらをタイプのリストの最後に追加することを検討しました。タイプが複数のインタフェースを実装したときに私たちが直面する問題は、インタフェースの順序を定義しました。」

ですから、DataTemplateSelectorを明示的に両方のタイルとTileRunのためのDataTemplateを定義したり、使用する必要がありますどちらか。の

関連する問題