【问题标题】:Using Path=. and Converter inside Binding使用路径=。和 Binding 里面的 Converter
【发布时间】:2017-02-18 17:00:28
【问题描述】:

我无法为 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();
    }
}

如果输入是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 是EntryNode 类型的对象,而Binding Path=. 应该保留就这样。 那么问题出在哪里?编译器在谈论什么字符串?我该如何纠正这个问题,以便编译器不会抱怨?

这里是 TreeView 的完整代码供参考。集合“AllNodesAndEntries”是一个ObservableCollection&lt;object&gt;,它包含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


    【解决方案1】:

    你的转换器肯定是在 ResourceDictionary 中声明的,所以它应该被引用为 StaticResource:

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

    或更短:

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

    【讨论】:

    • 事实上,没有。它没有在 ResourceDictionary 中定义。但是由于您关于引用源的提示,我能够用这个答案解决它:stackoverflow.com/a/2304330/5333340
    【解决方案2】:

    基于线程 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 2013-11-15
      • 2020-08-31
      • 1970-01-01
      • 2013-08-24
      相关资源
      最近更新 更多