如何以编程方式将按钮添加到单个TreeViewItem

时间:2011-07-18 17:20:18

标签: wpf button treeviewitem

我动态地生成TreeView(TV)的内容,并且根据我用于获取树的项目的某些属性,想要将按钮附加到某些TreeViewItems(TVI)。

我的应用程序中某个特定电视的所有TVI都需要此功能。可能简化任务的一点是,该树中的所有根项都需要按钮。换言之,除TVI内部的TVI外,特定电视内的每个TVI都需要一个按钮。

我在思考模板的想法,但我只能看到如何为电视中的所有TVI添加按钮。另一种选择(我认为......我还没试过这个但是听起来还不错)就是只需在电视中的所有内容上添加按钮,然后将源项目的相关属性绑定到按钮的可见性上,这似乎是一个完整的黑客,我大多相信必须有一个更优雅的解决方案。

关于如何解决此问题的任何想法?

2 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:0)

这是我使用的代码:

类CurrentDriveDataTemplateSelector:DataTemplateSelector     {         public DataTemplate currentDriveTemplate {get;组;}         public 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