<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>
WPF: DataTemplate через DataType в TreeView
Код:
Здесь имеются примеры:
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 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;
}
}
{
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;
}
}
?
Но почему не работает этот вариант?.. Да, кстати, следуя второму примеру кое что удалось сделать. Но это безобразие заязано на главный узел, а от него уже идет вниз. У меня же корней может быть несколько и мне хотелось, чтобы коллекции задавались таким образом, как показано выше...
Код:
Код:
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;
}
}
{
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}"/>
<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>
<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();
}
}
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();
}
}