绑定转换器不';t应用于根TreeViewItem元素(WPF)
本文关键字:TreeViewItem 元素 WPF 应用于 转换器 绑定 | 更新日期: 2023-09-27 18:00:22
我正在使用WPF提供的TreeView控件创建一个文件资源管理器应用程序。我对它进行了自定义,使它在路径旁边显示一个文件图标。我正在使用IValueConverter将路径转换为所需的图像,我基于此页面:http://www.codeproject.com/Articles/21248/A-Simple-WPF-Explorer-Tree
它基本有效!除了根TreeViewItems由于某些原因不显示图标之外。我在IValueConverter::Convert()函数上放置了一个断点,并确认它不会对根节点执行,但会对之后的所有子节点执行。
VS输出窗口没有显示绑定错误,所以我不知道这是怎么发生的。有什么想法吗?
转换器代码:
[ValueConversion(typeof(string), typeof(bool))]
public class HeaderToImageConverter : IValueConverter
{
public static HeaderToImageConverter Instance = new HeaderToImageConverter();
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if ((value as string).Contains(@"'"))
{
Uri uri = new Uri("pack://application:,,,/Images/diskdrive.png");
BitmapImage source = new BitmapImage(uri);
return source;
}
else
{
Uri uri = new Uri("pack://application:,,,/Images/folder.png");
BitmapImage source = new BitmapImage(uri);
return source;
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException("Cannot convert back");
}
}
树视图XAML:
<TreeView Grid.Column="0" Name="fileExplorer" Margin="8,8,8,8">
<TreeView.Resources>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image Width="20" Height="20" Stretch="Fill" Source="{Binding Converter={x:Static local:HeaderToImageConverter.Instance}}" />
<TextBlock Text="{Binding}" Margin="5,0" VerticalAlignment="Center"/>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</TreeView.Resources>
我遇到了类似的问题。但除TreeView.Resources
外,我还含有TreeView.ItemContainerStyle
元素。将Style元素移到那里实际上只设置了根的样式,而没有设置子项的样式。因此,一个解决方案是将元素放在两个位置。
树视图XAML:
<TreeView Grid.Column="0" Name="fileExplorer" Margin="8,8,8,8">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image Width="20" Height="20" Stretch="Fill" Source="{Binding Converter={x:Static local:HeaderToImageConverter.Instance}}" />
<TextBlock Text="{Binding}" Margin="5,0" VerticalAlignment="Center"/>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</TreeView.ItemContainerStyle>
<TreeView.Resources>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image Width="20" Height="20" Stretch="Fill" Source="{Binding Converter={x:Static local:HeaderToImageConverter.Instance}}" />
<TextBlock Text="{Binding}" Margin="5,0" VerticalAlignment="Center"/>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</TreeView.Resources>
现在,最好不要重复使用这个HeaderTemplate
Setter。但我还没有找到这样做的方法。