2015-07-04 43 views
2

我需要通过在Windows Phone 8的绑定表达式来设置一个RichTextBox用户控制的XAML属性,我发现,这是不是一个DP,所以我决定从RichTextBox继承并添加一个DP,它将使用PropertyChanged事件更改Xaml属性,无论如何代码看起来像这样,剥离出不相关的部分。绑定的自定义依赖属性获取数据绑定到字符串不能转换例外

public class RichTextBoxWithBindableXaml : RichTextBox 
{ 
    public string BindableXaml 
    { 
     get { return (string)GetValue(BindableXamlProperty); } 
     set { SetValue(BindableXamlProperty, value); } 
    } 
    public static readonly DependencyProperty BindableXamlProperty = 
     DependencyProperty.Register("BindableXaml", 
            typeof(string), 
            typeof(RichTextBoxWithBindableXaml), 
            new PropertyMetadata(0));  
} 

//xaml code 

<local:RichTextBoxWithBindableXaml BindableXaml="{Binding PageContent , Mode=OneWay}"> </local:RichTextBoxWithBindableXaml> 

而且我得到以下异常可怕的消息: 对象类型“System.Windows.Data.Binding”不能转换为类型“System.String”。

我已经检查到这些异常和数据绑定,并通过右侧的建议类似的问题仍在继续,仍然不明白为什么一件简单的事情不会对我的工作类似问题的许多解决方案。上面列出的代码只是具有绑定表达式的DP的最简单实现。顺便说一句,源PageContent来自INotifyPropertyChanged对象,它的工作原理,我知道,因为它可以绑定到TextBlock的Text属性。

我失去了一些东西如此明显?我不想为这样简单的事情发表问题,但我似乎无法以任何方式解决问题。

编辑: 继P.S音符竟然是完全不相干的。

P.S.我最后的疑问是xmlns命名空间local加载的方式。它被加载为clr程序集,xaml解析器可能认为我的自定义继承类为clr-only,并且由于clr属性不是依赖项属性而引起混淆。希望它听起来不笨,我绝望。这是因为这样:

xmlns:local="clr-namespace:RumCli" 

回答

0

对于每个依赖属性一个必须提供一个非订阅值(不是C#这里术语),该套件对象,消费者将访问的类型。

引述MSDN Dependency Property Metadata

依赖属性的元数据作为存在能够被查询以检查依赖项属性的特性的对象。

所以对于value类型的结果,对于不同的值类型,诸如double一个默认使用double.NaN。 A decimal使用decimal.Zero。而一个字符串,string.empty是一个很好的基础。

这允许任何可能盲目的操作反映关闭属性,它可以确定它的真正属性类型是什么,并相应地访问它。

因此,将0分配给string在识别该属性是string(其将0标识为整数)时没有意义。因此intstring正在设置将来的运行时失败,当对象试图为其分配绑定,样式和其他项目时。

1

我发现我应该或者提供空PropertyMetadata(新PropertyMetadata(空)而不是0),或具有缺省值类型元数据,如果DP是应该使用在Xaml。对于我的场景,由于我将使用PropertyChangedCallback,传递给Register方法的propertymetadata看起来像这样。

new PropertyMetadata(default(string), new PropertyChangedCallback(OnBindableXamlChanged)) 

希望对别人有帮助。

+0

有关详细说明,请查看下面的OmegaMan答案。 – bahti