2016-10-10 22 views
0

У меня проблема с определением триггера для TreeViewItems. Я считаю, что это просто какая-то проблема синтаксиса, но я не знаю, что еще написать ...Использование Path =. и конвертер внутри привязки

Это Trigger:

<DataTrigger Binding="{Binding Path=., Converter=IsNodeConverter}" Value="True"> 
    <Setter Property="Focusable" Value="False"/> 
</DataTrigger> 

Поскольку она определена внутри TreeView.ItemContainerStyle, то DataContext должен быть сам элемент. Элемент может быть типа Node или Entry, и я хочу запускать для всех элементов, которые имеют тип Node. Так что я написал конвертер:

public class IsNodeConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value is Node) 
      return true; 

     return false; 
    } 

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

который возвращает true если он получает Node в качестве входных данных и false иначе.

Но в части Binding="{Binding Path=., Converter=IsNodeConverter}" компилятор жалуется: «IValueConverter не может преобразовать из строки». (оригинал: «Vom TypeConverter-Objekt für IValueConverter wird das Konvertieren aus einer Zeichenfolge nicht unterstützt.») Я этого совсем не понимаю: DataContext - это объект типа Entry или Node, а Binding Path=. должен хранить его таким образом. Так в чем проблема? О какой строке компилятор говорит? Как исправить это, чтобы компилятор не жаловался?

Вот полный код TreeView для справки. Коллекция «AllNodesAndEntries» - это ObservableCollection<object>, которая содержит как Node s, так и Entry s.

<TreeView ItemsSource="{Binding AllNodesAndEntries}"> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate ItemsSource="{Binding Children}" DataType="{x:Type usrLibVM:Node}"> 
      <TextBlock Text="{Binding Name}" Background="LightBlue"/> 
     </HierarchicalDataTemplate> 
     <DataTemplate DataType="{x:Type usrLibVM:Entry}"> 
      <TextBlock Text="{Binding Name}" Background="LightSalmon"/> 
     </DataTemplate> 
    </TreeView.Resources> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=., Converter=IsNodeConverter}" Value="True"> 
        <Setter Property="Focusable" Value="False"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TreeView.ItemContainerStyle> 
</TreeView> 

ответ

2

Ваш конвертер, безусловно, объявлен в ResourceDictionary, поэтому его следует ссылаться как StaticResource:

Binding="{Binding Path=., Converter={StaticResource IsNodeConverter}}" 

или короче:

Binding="{Binding Converter={StaticResource IsNodeConverter}}" 
+0

В fa ct, no. Он не определен в ResourceDictionary. Но благодаря вашему намеку относительно ссылки на источник, я смог решить это с помощью этого ответа: http://stackoverflow.com/a/2304330/5333340 – Kjara