I have a user control that i am using inside a DataTemplate
, this UserControl
contains a TextBox
which is binded with Value property(declared as a DependencyProperty
) of my UserControl
. In data template I bind this Value property with my actual property say Name (also a DependencyProperty
). It works properly, I assign a value to Name property while loading and my TextBox
displays it, i change the value from TextBox
and it updates my Name property also.
Now the problem comes while I add a PropertyChangedEventHandler
in the dependency property, I check for the value if it is valid, do nothing if valid and assign old value if not valid. In case of value not valid, when I assign it that old value, property updates but it is not displaying updated value in my TextBox
of UserControl
. Can anyone tell me why?
XAML of my UserControl
:
<UserControl x:Name="usercontrol">
<StackPanel>
<TextBlock ......./>
<TextBox Binding={Binding ElementName=usercontrol, Path=Value, Mode=TwoWay}/>
</StackPanel>
</UserControl>
In code behind Value is a DependencyProperty
I am using this in my 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>
This template I am using in a TreeView
. Inside TreeView
I enter value in the TextBox
which updates the Value property of my UserControl
, that in turn updates Name property of myClass
I am assigning a PropertyChangedCallback
to my Name Property in myClass
, performing some validation and reassigning the OldValue
if the validation fails. It in turn updates Value property also, but i am still seeing that the TextBox
has the same value that i entered earlier not the updated one.
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
}