2014-04-27 35 views
1

我使用WPF提供的TreeView控件创建文件资源管理器应用程序。我已经对它进行了自定义,使其显示路径旁边的文件图标。我正在使用IValueConverter将路径转换为所需的图像,我基于此页面:http://www.codeproject.com/Articles/21248/A-Simple-WPF-Explorer-Tree绑定转换器不适用于根TreeViewItem元素(WPF)

它主要起作用!除了根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"); 
    } 
} 

TreeView控件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> 

回答

0

我遇到了类似的问题。但除了TreeView.Resources我也有TreeView.ItemContainerStyle元素。将Style元素移动到那里,实际上只设置了根,而不是儿童。因此,解决方案是将元素放在两个地方。

TreeView控件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二传手。但我还没有找到办法做到这一点。