У меня есть пользовательский элемент управления, который я использую внутри DataTemplate
, этот UserControl
содержит TextBox
, который связан со свойством Value (объявленным как DependencyProperty
) моего UserControl
. В шаблоне данных я связываю это свойство Значение с моим фактическим свойством, скажем Имя (также DependencyProperty
). Он работает правильно, я присваиваю значение Имя свойство во время загрузки, и мой 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
, которое обновляет свойство Значение моего UserControl
, которое в свою очередь обновляет Имя свойство myClass
Я присваиваю PropertyChangedCallback
my Name Свойство в myClass
, выполнение некоторой проверки и переназначение OldValue
, если проверка не удалась. Это, в свою очередь, обновляет Значение свойство также, но я все еще вижу, что 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
}