2016-12-30 25 views
0

我有一個TreeView綁定到列表TilesetTileset包含TileGroup,TileGroup包含TileTileRun實例。無論TileTileRun實施ITile,但終究會有更多類型的實施ITileWPF中的自動模板選擇無法與接口

我有以下XAML:

<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> 

TilesetTileGroup選擇正確的DataTemplateITile不,沒有選擇模板,樹只顯示數據類型。

但是,如果我兩個TileTileRun添加DataTemplate明確,一切正常great.I不想,雖然做的,因爲最終會被更多的類實現ITile

我知道我可以使用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,然後爲其父類,祖父類等尋找。有非常明確的類型順序供我們應用。當我們談論添加對接口的支持時,我們考慮使用反射來找出所有接口並將它們添加到類型列表的末尾。我們遇到的問題是定義接口的訂單時的類型實現多個接口。」

所以,你將不得不定義兩個瓷磚和TileRun一個DataTemplate明示或使用DataTemplateSelector。