与模板内的转换器绑定

本文关键字:转换器 绑定 | 更新日期: 2023-09-27 18:04:17

我已经为ListBox定义了一个DataTemplate。在模板中,我使用TextBlock控件来显示数据上下文的属性。例如:

<TextBlock Text="{Binding Path=FirstName}" />

如果我这样做:

<TextBlock Visibility="{Binding Path=IsAccountValid}" />

…应用程序运行,但在输出中有一个关于尝试将布尔属性绑定到可见性枚举的警告。

如果我这样做:

<TextBlock Visibility="{Binding Path=IsAccountValid,Converter={StaticResource visibilityOfBool}}" />

在我的App.xaml的某个地方是:

<BooleanToVisibilityConverter x:Key="visibilityOfBool" />

我得到一个空引用异常。

我怀疑这可能是因为属性IsAccountValid不是一个依赖属性,所以我在窗口中添加了一个CheckBox,并这样做:

<TextBlock Visibility="{Binding Path=IsChecked,Converter={StaticResource visibilityOfBool},ElementName=butA}" />

但得到相同的错误。

为什么?DataContext对象是有效的,因为如果我将IsAccountValid绑定到Text属性,则值将正确显示。

转换器从未被调用,所以我想知道它是否是无法找到的转换器。

为什么找不到转换器?为什么转换器可以在数据模板外部找到,而不能在数据模板内部找到?

我试着用Blend再次构建模板,因为Blend通常会正确,但它生成的代码与我的相同。

我尝试了这个网站上建议的一些修复方法,包括将RelativeSource设置为templatparent和Self,但没有任何区别。

怎么回事?

与模板内的转换器绑定

我们在数据模板中一直使用这种转换器。是否在资源字典中定义转换器键?合并其他资源字典?

IsAccountValid属性不一定是依赖属性。如果找不到转换器,则无法打开表单。您使用转换器的方法是正确的,但是在没有看到更多信息的情况下,很难确切地说出是什么导致了异常。

正如Amittai和Chris指出的那样,你们的方向似乎是正确的。我知道这听起来有点愚蠢,但是尝试在绑定中的逗号和Converter=语句之间添加一个空格。像这样:

<TextBlock Visibility="{Binding Path=IsAccountValid, Converter={StaticResource visibilityOfBool}}" />

在某些系统中,当逗号后没有空格时,会出现奇怪的症状。我找不到真正的原因

感谢大家对我调查的帮助。

我已经解决了这个问题。

这两行代码包含在DataTemplate中,一行是TextBlock,另一行是超链接:

<TextBlock Text="Hello" Visibility="{Binding IsChecked,ElementName=chkBox,Converter={StaticResource visibilityOfBool}}" />

<TextBlock Grid.Column="1" >
    <Hyperlink Click="ProgHomePageHyperlink_Click" >
         <TextBlock Text="{Binding Path=Title}" />
    </Hyperlink>
</TextBlock>

当两者都包含在代码中时,运行时抛出空引用异常。

但是如果我注释掉其中一个,无论是TextBlock还是HyperLink,一切都运行正常。

如果我从超链接中删除Click处理程序,一切都会正常运行。

如果我注释掉TextBlock中的转换器,应用程序会运行,但会得到一个不匹配的绑定警告,这是值得的。

因此,在超链接中包含Click处理程序意味着无法找到TextBlock中的转换器。

这太奇怪了!