使用Path =。和转换器内部绑定

时间:2016-10-10 09:41:36

标签: wpf data-binding ivalueconverter

我无法为TreeViewItems定义触发器。我相信这只是一些语法问题,但我不知道还有什么要写的......

这是触发器:

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

由于它是在TreeView.ItemContainerStyle内定义的,DataContext应该是包含的项目本身。该项可以是NodeEntry类型,我想触发所有类型为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-ObjektfürIValueConverterwird das Konvertieren aus einer Zeichenfolgenichtunterstützt。”)我根本不明白这一点:DataContext是EntryNode类型的对象,{ {1}}应该保持这种方式。 那么问题是什么?编译器在说什么字符串?如何更正此问题以便编译器不会抱怨?

以下是TreeView的完整代码供参考。集合'AllNodesAndEntries'是Binding Path=.,其中包含ObservableCollection<object>Node s。

Entry

2 个答案:

答案 0 :(得分:3)

您的转换器肯定在ResourceDictionary中声明,因此它应该被引用为StaticResource:

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

或更短:

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

答案 1 :(得分:0)

根据帖子Using Value Converters in WPF without having to define them as resources first中的回答:

<DataTrigger Value="False">
    <DataTrigger.Binding>
        <Binding> <!-- <Binding Path="."> is possible but not necessary -->
            <Binding.Converter>
                <converterNamespace:IsNodeConverter/>
            </Binding.Converter>
        </Binding>
    </DataTrigger.Binding>
    <Setter Property="Focusable" Value="False"/>
</DataTrigger>