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