Tengo un control de usuario que estoy usando el interior de un DataTemplate
, este contiene una UserControl
TextBox
que se enganchan con Valor propiedad (declarada como una DependencyProperty
) de mi UserControl
. En la plantilla de datos enlace esta propiedad Valor con mi propiedad real, por ejemplo, Nombre (también DependencyProperty
). Funciona correctamente, asigno un valor a la propiedad Name mientras cargué y mi TextBox
lo muestra, cambio el valor de TextBox
y también actualiza mi propiedad Name. Ahora el problema surge mientras agrego un PropertyChangedEventHandler
en la propiedad de dependencia, verifico el valor si es válido, no hago nada si es válido y asigno el valor anterior si no es válido. En caso de que el valor no sea válido, cuando le asigno ese valor anterior, la propiedad se actualiza pero no muestra el valor actualizado en mi TextBox
de UserControl
. puede alguien decirme por que?WPF: Cuadro de texto texto no se actualiza
XAML de mi UserControl
:
<UserControl x:Name="usercontrol">
<StackPanel>
<TextBlock ......./>
<TextBox Binding={Binding ElementName=usercontrol, Path=Value, Mode=TwoWay}/>
</StackPanel>
</UserControl>
En código detrás Valor es una DependencyProperty
estoy usando esto en mi DataTemplate
:
<HierarchicalDataTemplate DataType="{x:Type myLib:myClass}" ItemsSource="{Binding Children}">
<Expander Header="{Binding}">
<WrapPanel>
<edproperty:TextPropertyEditor Caption="Name" Value="{Binding Name, Mode=TwoWay}"/>
<edproperty:TextPropertyEditor .................../>
<edproperty:TextPropertyEditor .................../>
<edproperty:TextPropertyEditor ...................../>
</WrapPanel>
</Expander>
</HierarchicalDataTemplate>
Esta plantilla soy usando en un TreeView
. Dentro TreeView
entro valor en el TextBox
que actualiza el Valor propiedad de mi UserControl
, que en las actualizaciones a su vez Nombre propiedad de myClass
voy a asignar un PropertyChangedCallback
a mi Nombre Propiedad en myClass
, realizar alguna validación y la reasignación de la OldValue
si la validación falla A su vez, también actualiza la propiedad Valor, pero aún veo que el TextBox
tiene el mismo valor que ingresé antes que el actualizado.
public string Name
{
get
{
return (string)GetValue(NameProperty);
}
set
{
SetValue(NameProperty, value);
}
}
// Using a DependencyProperty as the backing store for Name. This enables animation, styling, binding, etc...
public static readonly DependencyProperty NameProperty =
DependencyProperty.Register("Name", typeof(string), typeof(myClass), new UIPropertyMetadata(null, OnNameChanged));
protected static void OnNameChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
{
if(checkRequired && !IsValid(e.NewValue.ToString()))
{
checkRequired=false;
(sender as myClass).Name = args.OldValue.ToString();
}
}
private static bool IsValid(string name)
{
.............some logic here
}
Sin ver su código, va a ser difícil comentarlo correctamente. ¿Podrías publicar tu código por favor? –
es demasiado, no se puede publicar. Puedes preguntar si quieres más explicación. – viky
No, puedes escribir un código mínimo para reproducir ... De lo contrario, estaremos adivinando, no respondiendo. A nadie le gusta la incertidumbre. Especialmente los programadores. – Anvaka