У меня есть пользовательский элемент управления, который я использую внутри DataTemplate
, это UserControl
содержит TextBox
который переплетен с Value имущества (объявленное как DependencyProperty
) мой UserControl
. В шаблоне данных я связываю это Значение недвижимость с моим фактическим свойством сказать Название (также DependencyProperty
). Он корректно работает, я присваиваю значение . Название свойство во время загрузки и мой TextBox
отображает его, я меняю значение с TextBox
, и он обновляет мое . Идентификационное имя. Теперь проблема возникает, когда я добавляю PropertyChangedEventHandler
в свойство зависимости, проверяю значение, если оно действительно, ничего не делайте, если оно действительное, и присваивайте старое значение, если оно недействительно. Если значение недействительно, когда я назначаю ему это старое значение, обновляет свойство, но оно не отображает обновленное значение в моем TextBox
из UserControl
. Может ли кто-нибудь сказать мне, почему?WPF: TextBox Текст не обновляя
XAML моего UserControl
:
<UserControl x:Name="usercontrol">
<StackPanel>
<TextBlock ......./>
<TextBox Binding={Binding ElementName=usercontrol, Path=Value, Mode=TwoWay}/>
</StackPanel>
</UserControl>
В коде позади Value является 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
к моему Название собственности в 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
}
Не видя своего кода, это будет трудным для правильного комментирования. Не могли бы вы разместить свой код, пожалуйста? –
это слишком много, его нельзя опубликовать. Вы можете спросить, хотите ли вы больше объяснений. – viky
Нет, вы можете написать минимальный фрагмент кода для воспроизведения ... В противном случае мы будем гадать, а не отвечать. Никто не любит неопределенность. Особенно программисты .. – Anvaka