我有我使用的是内部的用户控件DataTemplate
,这个UserControl
包含一个TextBox
,其绑定与Value属性(声明为一个DependencyProperty
我的) UserControl
。 在数据模板,我这个Value属性绑定我的实际财产说名称 (也DependencyProperty
)。 它正常工作,我分配一个值,同时加载和我对Name属性TextBox
显示它,我改变值从TextBox
,同时也更新我的名称属性。 现在问题来了,而我添加PropertyChangedEventHandler
在依赖属性,我检查的值,如果它是有效的,如果有效什么也不做,如果没有有效的分配旧值。 在值无效的,当我给它分配旧的价值,性能更新,但它不是在我的显示更新值情况下, TextBox
的UserControl
。 谁能告诉我为什么?
我的XAML UserControl
:
<UserControl x:Name="usercontrol">
<StackPanel>
<TextBlock ......./>
<TextBox Binding={Binding ElementName=usercontrol, Path=Value, Mode=TwoWay}/>
</StackPanel>
</UserControl>
在后面的值代码是一个DependencyProperty
我在我使用这个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>
这个模板我正在使用一个TreeView
。 里面TreeView
我在输入值TextBox
哪些更新我的Value属性UserControl
,在之交更新Name属性myClass
我分配PropertyChangedCallback
我的名称属性在myClass
,执行一些验证和重新分配OldValue
如果验证失败。 这反过来又更新Value属性还可以,但我仍然看到该TextBox
有我较早进入而非更新的相同的值。
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
}