1

TreeView(TV) のコンテンツを動的に生成し、ツリーのソースとして使用しているアイテムの特定のプロパティに従って、いくつかの TreeViewItems(TVI) にボタンをアタッチしたいと考えています。

たまたま、アプリケーション内の 1 つの特定の TV のすべての TVI がこの機能を必要としています。タスクを単純化する可能性があるのは、そのツリーのすべてのルート項目にボタンが必要であるという事実です。言い換えると、TVI 内にある TVI を除いて、特定の TV 内のすべての TVI にボタンが必要です。

テンプレートの考えを考えていましたが、TV のすべての TVI にボタンを追加する方法しかわかりません。別のオプション (私は思う... これはまだ試していませんが、頭の中では問題ないように思えます) は、テレビのすべてにボタンを追加し、ソース項目の関連するプロパティをボタンの可視性にバインドすることですが、これは完全なハックのように思えますが、もっと洗練された解決策が必要だと私は確信しています。

これをやってのける方法についてのアイデアはありますか?

4

2 に答える 2

2

ビューモデルのプロパティからデータを動的に構築している場合は、DataTemplateSelectorの使用を検討できます。

実装では、データ項目に子があるかどうかを確認します。存在する場合は、ボタンでデータ テンプレートを返します。そうでない場合は、ボタンなしでデータ テンプレートを返します。何かのようなもの:

public class ButtonDataTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item,
        DependencyObject container)
    {
        FrameworkElement element = container as FrameworkElement;

        if (element != null)
        {
            YourClass itemAsYourClass = item as YourClass;

            if(itemAsYourClass != null)
            {
                bool hasChildren = itemAsYourClass.Children != null
                    && itemAsYourClass.Children.Count > 0;

                return element.FindResource(hasChildren
                    ? "withButtonTemplate"
                    : "withoutButtonTemplate"
                    );
            }
        }

        return null;
    }
}
于 2011-07-18T17:31:56.807 に答える
0

使用したコードは次のとおりです。

クラス CurrentDriveDataTemplateSelector : DataTemplateSelector { public DataTemplate currentDriveTemplate {get; set;} パブリック DataTemplate dirTemplate { get;} 設定; }

    public override DataTemplate SelectTemplate(object item,
        DependencyObject container)
    {
        FrameworkElement element = container as FrameworkElement;

        if (element != null)
        {
            Directory dir = item as Directory;

            if (dir != null)
            {
                bool isCurrentDrive = ((dir.parent == 0) && (dir.state == "current"));

                if (isCurrentDrive)
                {
                    return currentDriveTemplate;
                }
                return dirTemplate;
            }
        }
    }
}

<HierarchicalDataTemplate x:Key="normalDirTemplate" ItemsSource="{Binding Path=childdirs}">
        <TextBlock Text="{Binding Path=name}"/>
    </HierarchicalDataTemplate>

    <HierarchicalDataTemplate x:Key="currentDriveTemplate" ItemsSource="{Binding Path=childdirs}">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding Path=name}" Width="100"/>
            <Button Content="=>" Width="20"></Button>
        </StackPanel>
    </HierarchicalDataTemplate>

    <mine:CurrentDriveDataTemplateSelector
            currentDriveTemplate="{StaticResource currentDriveTemplate}"
            dirTemplate="{StaticResource normalDirTemplate}"
             x:Key="CurrentDriveDataTemplateSelector"/>

  ...blah

<TreeView Height="324" Margin="0,25,0,0" x:FieldModifier="private" x:Name="currentDirectoryTree" Width="150" ItemTemplateSelector="{StaticResource CurrentDriveDataTemplateSelector}">
    ...etc
于 2011-07-27T15:07:18.237 に答える