我需要通过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>
我收到以下可怕的异常消息: 对象类型&#39; System.Windows.Data.Binding&#39;无法转换为&#39; System.String&#39;。
我已经检查了许多这些异常的解决方案以及类似的数据绑定问题,并且仍然会在右侧查看建议的类似问题,但仍然无法理解为什么一个简单的事情对我不起作用。我上面列出的代码只是具有绑定表达式的DP的最简单实现。顺便说一下,源PageContent来自一个INotifyPropertyChanged对象,它可以工作,我知道因为它可以绑定到TextBlock的Text属性。
我错过了一些如此明显的东西吗?我不想为这么简单的事情发帖提问,但我似乎无法以任何方式解决。
编辑: 事实上,P.S的说明完全无关紧要。
P.S。我最后的疑问是加载xmlns名称空间本地的方式。它作为clr程序集加载,xaml解析器可以将我的自定义继承类视为仅clr并且混淆,因为clr属性不是依赖项属性。希望它听起来不傻,我绝望了。就是这样:
xmlns:local="clr-namespace:RumCli"
答案 0 :(得分:1)
我发现我应该提供一个null PropertyMetadata(新的PropertyMetadata(null)而不是0),或者如果DP应该在Xaml中使用,则提供具有默认值类型的元数据。对于我的sceneario,由于我将使用PropertyChangedCallback,传递给Register方法的propertymetadata将如下所示。
new PropertyMetadata(default(string), new PropertyChangedCallback(OnBindableXamlChanged))
希望,这对其他人有帮助。
答案 1 :(得分:0)
对于每个依赖项属性,必须提供非预订值(此处不是C#术语),它包含消费者将访问的对象类型。
引用MSDN Dependency Property Metadata
依赖项属性元数据作为可查询的对象存在,以检查依赖项属性的特征。
因此,对于value
类型结果,不同值类型的默认值(例如double
)将使用double.NaN
。 decimal
使用decimal.Zero
。虽然是一个字符串,string.empty
可以作为基础。
允许盲目地反映属性的任何操作,它可以确定其真正的属性类型是什么,并相应地访问它。
因此,将0
分配给string
对于确定属性是string
没有任何意义,0将0标识为整数。因此int
作为string
在对象尝试为其分配绑定,样式和其他项时设置未来的运行时失败。