Как программно добавить кнопку в один TreeViewItem - PullRequest
1 голос
/ 18 июля 2011

Я генерирую содержимое TreeView (TV) динамически и, в соответствии с определенными свойствами элементов, которые я использую для создания источника дерева, хотел бы прикрепить кнопки к некоторым элементам TreeViewItems (TVI).

Так получилось, что все функции TVI одного конкретного телевизора в моем приложении нуждаются в этой функции.Что может упростить задачу, так это тот факт, что все корневые элементы в этом дереве нуждаются в кнопках.Перефразируя, каждый TVI внутри конкретного телевизора нуждается в кнопке, кроме тех TVI, которые находятся внутри TVI.

Я думал о шаблонах, но я могу только видеть, как добавить кнопки ко всем TVI в телевизоре.Другой вариант (я думаю ... я еще не пробовал, но в моей голове это звучит нормально) - просто добавить кнопки ко всему на телевизоре и связать соответствующее свойство элементов источника с видимостью кнопок, ноэто похоже на полный взлом, и я в основном убежден, что должно быть более элегантное решение.

Есть идеи, как это осуществить?

Ответы [ 2 ]

2 голосов
/ 18 июля 2011

Если вы динамически строите данные на основе свойств в модели представления, вы можете использовать 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;
    }
}
0 голосов
/ 27 июля 2011

Вот код, который я использовал:

класс 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
...