我为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设置为TemplateParent和Self,但它没有任何区别。
发生了什么事?
答案 0 :(得分:1)
我们在数据模板中始终使用此类转换器。您是否在资源字典中定义了转换器密钥?合并另一个资源字典?
答案 1 :(得分:0)
IsAccountValid属性不必是依赖项属性。如果找不到转换器,那么您将无法打开表单。你有正确的方法使用转换器,但很难确切地说出导致异常的原因而没有看到更多的信息。
答案 2 :(得分:0)
阿米泰和克里斯指出,看来你正朝着正确的方向前进。我知道这听起来有点愚蠢,但尝试在逗号和绑定中的Converter=
语句之间添加一个空格。像这样:
<TextBlock Visibility="{Binding Path=IsAccountValid, Converter={StaticResource visibilityOfBool}}" />
在某些系统上,当逗号后面没有空格时会出现奇怪的症状。我找不到真正的原因。
答案 3 :(得分:0)
感谢大家的调查帮助。
我已经解决了这个问题。
这两行代码包含在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中的转换器。
有多奇怪!