1

私はWPFが初めてなので、明らかな何かが欠けている可能性がありますが、どこにも答えを見つけることができませんでした.

基本的に、特定の方法でソートするカスタム ツリー コレクションを構築しており、ツリーのノードはコレクションの型に型付けされています。ノードが一般的である場合、でのテストは機能TreeViewHierarchicalDataTemplateません。一般的でない場合は問題ありません。

説明する簡単なノード クラスを次に示します。

public class SimpleNode<T>
{
    private List<SimpleNode<T>> _children;
    private string _name;

    public SimpleNode(string name)
    {
        _name = name;
    }

    public List<SimpleNode<T>> Children
    {
        get
        {
            return _children;
        }
        set
        {
            _children = value;
        }
    }

    public string Name
    {
        get
        {
            return _name;
        }
    }
}

次にxamlで:

HierarchicalDataTemplate DataType="{x:Type local:SimpleNode`1}" ItemsSource="{Binding Children}"

明らかに、型に追加された `1 は、SimpleNode1 つの汎用パラメーターを持つ結果です。ジェネリックスのクラスを削除するHierarchicalDataTemplateと、動作し、TreeView. ジェネリックが配置されていると、それはできません。

何か案は?

前もって感謝します。

4

1 に答える 1

4

すぐに使用できるサポートはありません。DataTemplateSelectorただし、ジェネリックをサポートする独自のものを作成することで機能させることができます。

public class OpenGenericTypeDataTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item,
                                                DependencyObject container)
    {
        var element = container as FrameworkElement;
        if (item != null && element != null)
        {
            if (item.GetType().IsGenericType)
            {
                var genericTypeDefinition = item.GetType()
                                                .GetGenericTypeDefinition();
                var key = new DataTemplateKey(genericTypeDefinition);
                return element.TryFindResource(key) as DataTemplate;
            }
        }

        return null;
    }
}

次のように使用できます。

<UserControl.Resources>
  <OpenGenericTypeDataTemplateSelector x:Key="GenericTemplateSelector" />
</UserControl.Resources>
...
<TreeView ItemTemplateSelector="{StaticResource GenericTemplateSelector}" ...>
  <TreeView.Resources>
    <HierarchicalDataTemplate DataType="{x:Type local:SimpleNode`1}"
                              ItemsSource="{Binding Children}">
      ...
    </HierarchicalDataTemplate>
  </TreeView.Resources>

これが実際に行うことは非常に単純です。特定のタイプ
の を作成するDataTemplateと、そのタイプの名前が自動的にそのテンプレートのキーになります。
デフォルトDataTemplateSelectorでは、アイテムのタイプがルックアップ値として使用されます。しかし、ジェネリック クラスのインスタンスの型は、クローズ ジェネリック型、つまり、ジェネリック型パラメーターが指定された型です。
問題: テンプレートがオープン ジェネリック型に登録されている、つまり、ジェネリック型パラメーターが指定されていない。そのため、既定では、オープン ジェネリック型に登録されている sDataTemplateSelectorが取得されません。DataTemplate
私が提供した実装は、項目の型をチェックするだけで、オープン ジェネリック型のサポートを追加します。ジェネリック型の場合は、オープン ジェネリック型を ( 経由でGetGenericTypeDefinition) 取得し、それをキーとして使用します。

このセレクターを実際に使用するには、使用するTreeView必要があることを に伝える必要があります。を指定することでそれを行っていItemTemplateSelectorます。

于 2012-12-10T16:13:30.910 に答える