WPF - 无法将'<null>'从类型'<null>'转换为'System.Uri'</null> </null>

时间:2009-05-05 18:23:07

标签: wpf data-binding

我有一个简单的用户控件来显示文本块中的超链接:

LinkTextBlock.xaml:

<TextBlock >
    <Hyperlink NavigateUri="{Binding Url, ElementName=root}" >
        <TextBlock Text="{Binding Text, ElementName=root}" />
    </Hyperlink>   
</TextBlock>

LinkTextBlock.xaml.cs:

public static readonly DependencyProperty UrlProperty = DependencyProperty.Register("Url", typeof (string), typeof (LinkTextBlock));
public string Url
{
    get { return (string) GetValue(UrlProperty); }
    set { SetValue(UrlProperty, value); }
}
public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof (string), typeof (LinkTextBlock));
public string Text
{
    get { return (string) GetValue(TextProperty); }
    set { SetValue(TextProperty, value); }
}


然后,在ListBox的DataTemplate中我有:

<Controls:LinkTextBlock Text="{Binding Email}" Url="{Binding Email}" />


当我运行应用程序时,它似乎完美无缺。控件正确显示超链接,没有明显的问题。但是,当我查看“输出”窗口时,我得到了异常,每个ListBox项都有一个异常:

  

System.Windows.Data错误:22:不能   将''从类型''转换为   输入'en-US'文化的'System.Uri'   默认转换;考虑   使用Binding的Converter属性。   NotSupportedException异常:的“System.NotSupportedException:   UriTypeConverter无法转换   (空值)。在   System.ComponentModel.TypeConverter.GetConvertFromException(对象   价值)   System.ComponentModel.TypeConverter.ConvertFrom(ITypeDescriptorContext   上下文,CultureInfo文化,对象   价值)   System.UriTypeConverter.ConvertFrom(ITypeDescriptorContext   上下文,CultureInfo文化,对象   价值)   MS.Internal.Data.DefaultValueConverter.ConvertHelper(对象   o,输入destinationType,   DependencyObject targetElement,   CultureInfo文化,布尔   isForward)'

为什么会这样?我知道绑定错误是绑定到NavigateURI的结果。 你有什么建议吗?我能做些什么呢?我非常感谢您的投入。

由于

2 个答案:

答案 0 :(得分:3)

我明白了。问题是在执行从字符串到Uri的隐式转换时,因为NavigateUri的类型为Uri。 我需要创建一个转换器来将字符串转换为Uri,将我的属性从String更改为Uri,并且一切正常,没有例外。

答案 1 :(得分:-1)

不应该这个

<TextBlock >
    <Hyperlink NavigateUri="{Binding Url, ElementName=root}" >
        <TextBlock Text="{Binding Text, ElementName=root}" />
    </Hyperlink>   
</TextBlock>
是吗?

<TextBlock  Text="{Binding Text, ElementName=root}">
    <Hyperlink NavigateUri="{Binding Url, ElementName=root}" />
</TextBlock>