属性已由’FrameworkElement’注册

我正在编写两个依赖项属性,并且我在VS11的设计窗口中不断收到“[Property]已经由’FrameworkElement’注册”错误。 这是我的代码片段

public static readonly DependencyProperty IsEditingNumberProperty = DependencyProperty.Register("IsEditingNumbers", typeof(bool), typeof(FrameworkElement), new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.AffectsRender)); 

问题似乎是第3个参数(所有者参数typeof(FrameworkElement))。 如果我将第3个参数设置为包含两个依赖项属性的类,则错误消失,但我不能直接使用xaml中的属性。 在使用之前,我必须为每个依赖属性添加所有权。

实际上,它确实正确渲染,但只有当我第一次打开它时。 第一次渲染后,它会立即给我一个例外。 在运行时,它似乎完美地工作。

我做错了什么,有没有办法摆脱这个恼人的错误?

—-编辑—–

这是我的自定义类(包括2个依赖属性):

 public partial class EditableTextBox : UserControl { #region Dependency Properties public static readonly DependencyProperty IsEditingNumberProperty = DependencyProperty.Register("IsEditingNumber", typeof(bool), typeof(FrameworkElement), new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.AffectsRender)); public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(FrameworkElement), new FrameworkPropertyMetadata("0", FrameworkPropertyMetadataOptions.AffectsRender) { CoerceValueCallback = new CoerceValueCallback((sender,value) => { return expressionRestaraint.Match((string)value).Value; }) }); #endregion public static Regex expressionRestaraint = new Regex("[-a-zA-z0-9+*.\\(\\)\\[\\]\\{\\}]*"); public string Text { get { (string)GetValue(TextProperty); } set { SetValue(TextProperty, value); tbxValue.Text = (string)GetValue(TextProperty); } } public bool IsEditingNumber { get { return (bool)GetValue(IsEditingNumberProperty); } set { bool old = (bool)GetValue(IsEditingNumberProperty); if (old != value) { if (!value) stopEditing(); else startEditing(); SetValue(IsEditingNumberProperty, value); } } } . . . 

在主类中使用:

    . . . 

—编辑—包装器已修复(当所有权属于声明的类时,导致xaml属性不会更改的问题)

  public partial class EditableTextBox : UserControl { #region Dependency Properties public static readonly DependencyProperty IsEditingNumberProperty = DependencyProperty.Register("IsEditingNumber", typeof(bool), typeof(EditableTextBox), new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.AffectsRender) { PropertyChangedCallback = new PropertyChangedCallback((sender, arg) => { EditableTextBox ed = sender as EditableTextBox; if (!(bool)arg.NewValue) ed.stopEditing(); else ed.startEditing(); }), }); public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(EditableTextBox), new FrameworkPropertyMetadata("0", FrameworkPropertyMetadataOptions.AffectsRender) { PropertyChangedCallback = new PropertyChangedCallback((sender,arg) => { EditableTextBox ed = sender as EditableTextBox; ed.tbxValue.Text = arg.NewValue as string; }), CoerceValueCallback = new CoerceValueCallback((sender,value) => { return expressionRestaraint.Match((string)value).Value; }) }); #endregion public static Regex expressionRestaraint = new Regex("[-a-zA-z0-9+*.\\(\\)\\[\\]\\{\\}]*"); public string Text { get { return (string)GetValue(TextProperty); } set { SetValue(TextProperty, value); } } public bool IsEditingNumber { get { return (bool)GetValue(IsEditingNumberProperty); } set { SetValue(IsEditingNumberProperty, value); } } 

DependencyProperty.Register方法的第三个参数ownerType必须是声明该属性的类。

如果您的类是MyClass则声明必须如下所示:

 public class MyClass : DependencyObject { public static readonly DependencyProperty IsEditingNumberProperty = DependencyProperty.Register( "IsEditingNumber", typeof(bool), typeof(MyClass), ...); // CLR wrapper public bool IsEditingNumber { get { return (bool)GetValue(IsEditingNumberProperty); } set { SetValue(IsEditingNumberProperty, value); } } }