Binding custom dependency 属性 gets databinding to string cannot convert 异常
Binding custom dependency property gets databinding to string cannot convert exception
我需要通过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 的文本 属性.
我是不是漏掉了这么明显的东西?我不想post质疑这么简单的事情,但我似乎无法以任何方式解决。
编辑:
P.S 后的注释结果完全无关紧要。
P.S。我最后的疑问是加载 xmlns 命名空间本地的方式。它作为 clr 程序集加载,xaml 解析器是否认为我的自定义继承 class 为 clr-only 并且混淆,因为 clr 属性不是依赖属性。希望这听起来不傻,我很绝望。是这样的:
xmlns:local="clr-namespace:RumCli"
我发现我应该提供一个 null PropertyMetadata(new PropertyMetadata(null) 而不是 0),或者如果应该在 Xaml 中使用 DP,则提供一个具有默认值类型的元数据。对于我的场景,由于我将使用 PropertyChangedCallback,因此将传递给 Register 方法的属性元数据如下所示。
new PropertyMetadata(default(string), new PropertyChangedCallback(OnBindableXamlChanged))
希望对其他人有帮助。
对于每个依赖项 属性 必须提供一个非订阅值(这里不是 C# 术语),它适合消费者将访问的对象类型。
引用MSDNDependency Property Metadata
Dependency property metadata exists as an object that can be queried to examine the characteristics of a dependency property.
因此对于 value
类型的结果,不同值类型的默认值,例如 double
是使用 double.NaN
。 A decimal
使用 decimal.Zero
。虽然是字符串,但 string.empty
作为基础很好。
这允许任何可能盲目地 反射 属性 的操作,它可以确定其真正的 属性 类型是什么并相应地访问它。
因此,将 0
分配给 string
在识别 属性 是一个 string
时毫无意义,其中 0 将其识别为整数。因此 int
和 string
正在设置一个未来的运行时失败,当对象试图向它分配绑定、样式和其他项目时。
我需要通过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 的文本 属性.
我是不是漏掉了这么明显的东西?我不想post质疑这么简单的事情,但我似乎无法以任何方式解决。
编辑: P.S 后的注释结果完全无关紧要。
P.S。我最后的疑问是加载 xmlns 命名空间本地的方式。它作为 clr 程序集加载,xaml 解析器是否认为我的自定义继承 class 为 clr-only 并且混淆,因为 clr 属性不是依赖属性。希望这听起来不傻,我很绝望。是这样的:
xmlns:local="clr-namespace:RumCli"
我发现我应该提供一个 null PropertyMetadata(new PropertyMetadata(null) 而不是 0),或者如果应该在 Xaml 中使用 DP,则提供一个具有默认值类型的元数据。对于我的场景,由于我将使用 PropertyChangedCallback,因此将传递给 Register 方法的属性元数据如下所示。
new PropertyMetadata(default(string), new PropertyChangedCallback(OnBindableXamlChanged))
希望对其他人有帮助。
对于每个依赖项 属性 必须提供一个非订阅值(这里不是 C# 术语),它适合消费者将访问的对象类型。
引用MSDNDependency Property Metadata
Dependency property metadata exists as an object that can be queried to examine the characteristics of a dependency property.
因此对于 value
类型的结果,不同值类型的默认值,例如 double
是使用 double.NaN
。 A decimal
使用 decimal.Zero
。虽然是字符串,但 string.empty
作为基础很好。
这允许任何可能盲目地 反射 属性 的操作,它可以确定其真正的 属性 类型是什么并相应地访问它。
因此,将 0
分配给 string
在识别 属性 是一个 string
时毫无意义,其中 0 将其识别为整数。因此 int
和 string
正在设置一个未来的运行时失败,当对象试图向它分配绑定、样式和其他项目时。