【发布时间】:2017-02-18 17:00:28
【问题描述】:
我无法为 TreeViewItems 定义触发器。我相信这只是一些语法问题,但我不知道还要写什么......
这是触发器:
<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();
}
}
如果输入是Node,则返回true,否则返回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>,它包含Nodes 和Entrys。
<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>
【问题讨论】:
标签: wpf data-binding ivalueconverter