3

問題

のコレクションがあり、IThingの を作成したいと考えてHierarchicalDataTemplateいますTreeView。おそらく、WPF 作成者が可能なDataType={x:Type local:IThing}あいまいさを処理したくなかったためです。

これはIThing異なるソースからの s を同時に処理する必要があるため、実装クラスを参照することは問題外です。

現在のソリューション

今のところ、具体的な実装を通じて IThing をプロキシする ViewModel を使用しています。

public interface IThing {
    string SomeString { get; }
    ObservableCollection<IThing> SomeThings { get; }
    // many more stuff
}

public class IThingViewModel
{
     public IThing Thing { get; }
     public IThingViewModel(IThing it) { this.Thing = it; }
}

<!-- is never applied -->
<HierarchicalDataTemplate DataType="{x:Type local:IThing}">

<!-- is applied, but looks strange -->
<HierarchicalDataTemplate
    DataType="{x:Type local:IThingViewModel}"
    ItemsSource="{Binding Thing.SomeThings}">
    <TextBox Text="{Binding Thing.SomeString}"/>
</HierarchicalDataTemplate>

質問

より良い (つまり、プロキシがない) 方法はありますか?

4

3 に答える 3

5

別の方法(jingのソリューションと同様):アイテムのタイプが1つしかない場合は、ItemTemplateを直接設定できます。その後、キーやデータ型を設定する必要はありません。

ViewModelの場合:

public ObservableCollection<IThing> Thingies { get; private set; }

ビューで:

<TreeView ItemsSource="{Binding Thingies}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding SomeThings}">
            <TextBox Text="{Binding SomeString}" />    
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>
于 2012-03-21T11:56:45.307 に答える
3

これは、デフォルトのテンプレートセレクターが具体的なタイプのみをサポートし、インターフェイスはサポートしないためです。カスタムDataTemplateSelectorを作成し、それをTreeViewのItemTemplateSelectorプロパティに適用する必要があります。例を見つけたURLが見つかりませんが、この情報があれば、Googleで検索できます。

于 2008-12-16T17:02:26.050 に答える
2

もう1つの解決策は、HierarchicalDataTemplateにキーを指定して、それをWindows.Resourcesに配置し、TreeViewで手動で参照することです。 <TreeView ItemDataTemplate={StaticResource templateKey}/>

ただし、これにより、WPFTreeViewによって提供されるデータ型に応じたデータテンプレートの自動選択が制限されます。

于 2010-04-02T08:09:58.157 に答える