Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

WPF: DataTemplate через DataType в TreeView

9.7K
26 июля 2011 года
Vitamant
228 / / 07.02.2011
Доброго времени суток! Есть такое вот замловское описание контрола, построенного вокруг TreeView. К TreeView подключается несколько коллекций, и они должны бы бы были задатемплетиться... но нет - никакой визуализации! >_< При этом, если я вручную назначу TreeView свой шаблон - все замечательно отобразится. Но, поскольку шаблонов будет несколько, важно чтобы они подключались сами в зависимсоти от типа node'а.
Код:
<UserControl x:Class="ShellControls.ShellTree"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d"
             xmlns:local="clr-namespace:ShellControls"
             d:DesignHeight="300" d:DesignWidth="300" Loaded="UserControl_Loaded">
    <UserControl.Resources>
        <local:ShellTreeNodsCollection x:Key="collection"/>
        <HierarchicalDataTemplate DataType="{x:Type local:ShellTreeItem}" ItemsSource="{Binding Path=Items}">
            <Grid>
                <Image HorizontalAlignment="Left" Source="{Binding Icon}" Width="16" Height="16" Margin="0"/>
                <TextBlock HorizontalAlignment="Left" Text="{Binding Header}" Margin="20,0,0,0"/>
            </Grid>
        </HierarchicalDataTemplate>
    </UserControl.Resources>
    <TreeView x:Name="tree">
        <TreeView.ItemsSource>
            <CompositeCollection>
                <CollectionContainer Collection="{Binding Source={StaticResource collection}}"/>
                <TreeViewItem Header="s"/>
                <Separator/>
                <TreeViewItem Header="s"/>
            </CompositeCollection>
        </TreeView.ItemsSource>
    </TreeView>
</UserControl>


Здесь имеются примеры:
http://msdn.microsoft.com/ru-ru/library/system.windows.datatemplate.datatype.aspx
http://msdn.microsoft.com/ru-ru/library/system.windows.hierarchicaldatatemplate.aspx
Делаю, вроде бы, все также - а результата не видно. Не цепляет он шаблон отображения! >_< При этом вручную занесенные айтемы отображает. =\

В коде:
 
Код:
public class ShellTreeItem : HeaderedItemsControl
    {
        public bool AbsolutePath { get; set; }
        //public string Header { get; set; }
        public string Path { get; set; }
        public ImageSource Icon { get; set; }
    }

    public class ShellTreeNodsCollection : ObservableCollection<object> { };


Придется юзать что-нибудь навроде:
Код:
public class ShellItemDataTemplateSelector : DataTemplateSelector
    {
        public override DataTemplate SelectTemplate(object node, DependencyObject container)
        {
            var treeView = container as TreeView;
            var item = node as ShellTreeItem;
            if (treeView != null && item != null)
                return treeView.FindResource("shellItemDataTemplate") as DataTemplate;
            return null;
        }
    }

?

Но почему не работает этот вариант?.. Да, кстати, следуя второму примеру кое что удалось сделать. Но это безобразие заязано на главный узел, а от него уже идет вниз. У меня же корней может быть несколько и мне хотелось, чтобы коллекции задавались таким образом, как показано выше...
9.7K
26 июля 2011 года
Vitamant
228 / / 07.02.2011
Сделал, как и предполагал, через селектр:

Код:
Код:
public class ShellItemDataTemplateSelector : DataTemplateSelector
    {
        public DataTemplate SeparatorTemplate { get; set; }
        public HierarchicalDataTemplate ShellTreeItemTemplate { get; set; }

        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            if (item is Separator)
                return SeparatorTemplate;
            else if (item is ShellTreeItem)
                return ShellTreeItemTemplate;
            else return null;
        }
    }


XAML:
Код:
<UserControl.Resources>
        <HierarchicalDataTemplate x:Key="ShellTreeItemTemplate" DataType="{x:Type local:ShellTreeItem}" ItemsSource="{Binding Path=Items}">
            <Grid>
                <Image HorizontalAlignment="Left" Source="{Binding Icon}" Width="16" Height="16" Margin="0"/>
                <TextBlock HorizontalAlignment="Left" Text="{Binding Header}" Margin="20,0,0,0"/>
            </Grid>
        </HierarchicalDataTemplate>
        <DataTemplate x:Key="SeparatorTemplate" DataType="{x:Type Separator}"/>
        <local:ShellItemDataTemplateSelector x:Key="shellItemDataTemplateSelector" SeparatorTemplate="{StaticResource SeparatorTemplate}" ShellTreeItemTemplate="{StaticResource ShellTreeItemTemplate}"/>
    </UserControl.Resources>
    <TreeView x:Name="tree" ItemTemplateSelector="{StaticResource shellItemDataTemplateSelector}"/>


Но, если возможно обойтись одним только DataType, лучше бы было сделать именно так...
Теперь осталось найти - как сделать Separator неселектабельным... >_>

---

"Невыделябельность" реализовал так:
XAML:
 
Код:
...
<local:SelectedItemClassToSelectedColorConverter x:Key="selectedItemClassToSelectedColorConverter"/>
...
<TreeView x:Name="tree">
  <TreeView.Resources>
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="{Binding Path=SelectedItem, ElementName=tree, Converter={StaticResource selectedItemClassToSelectedColorConverter}}"/>
  </TreeView.Resources>
</TreeView>


C#:
Код:
[ValueConversion(typeof(object), typeof(Color))]
    public class SelectedItemClassToSelectedColorConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is Separator)
                return Colors.Transparent;
            else
                return Colors.LightBlue;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог