c# wpf properties frameworks element

c# - propiedad ya fue registrada por ''FrameworkElement''



wpf properties (1)

Estoy escribiendo dos propiedades de dependencia y sigo recibiendo el error "[Propiedad] que ya estaba registrada por ''FrameworkElement''" en la ventana de diseño de VS11. Aquí hay un fragmento de mi código.

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

El problema parece ser el 3er parámetro (tipo de parámetro propietario (FrameworkElement)). Si configuro el tercer parámetro en la clase que contiene dos propiedades de dependencia, el error desaparece, pero no puedo usar las propiedades directamente desde xaml. Tendría que agregar propiedad para cada propiedad de dependencia antes de usarla.

En realidad, se procesa correctamente, pero solo cuando lo abro por primera vez. Inmediatamente después del primer render, me dará una excepción. En tiempo de ejecución, parece funcionar perfectamente.

¿Estoy haciendo algo mal y hay una manera de deshacerme de este error molesto?

---- Editar -----

Aquí está mi clase personalizada (incluye 2 de las propiedades de dependencia):

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); } } } . . .

Uso en la clase principal:

<Window x:Class="VisualMathExpression.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:edit="clr-namespace:VisualMathExpression.EditableTextBox" xmlns:all="clr-namespace:VisualMathExpression" Title="MainWindow" Height="350" Width="525"> <StackPanel> <edit:EditableTextBox HorizontalAlignment="Center" VerticalAlignment="Center" Text="af" IsEditingNumber="True" /> . . .

--- Editar --- Se corrigió Wrapper (problema que hace que la propiedad xaml no cambie cuando la propiedad pertenece a la clase declarada)

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); } }


El tercer parámetro ownerType del método DependencyProperty.Register debe ser la clase que declara la propiedad.

Si su clase es MyClass la declaración tendría que verse así:

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); } } }