Я использую элемент управления treeview внутри моего usercontrol.Usercontrol используется в MainWindow (только для тестирования).DataContext из MainWindow - это моя ViewModel.В коде позади usercontrol я установил некоторое DependencyProperty, и все работает нормально, за исключением свойства, которое не вызывает обратный вызов.В ViewModel есть дерево ObservableCollection.MyObject содержит свойство ObservableCollection Leafs.Это древовидная структура, которую я использую для заполнения TreeView.
Если я передаю свойство Tree в usercontrol (назначаем источник DependencyProperty), он работает нормально.Я имею в виду, что если я изменяю элементы внутри Tree в ViewModel, Source запускает уведомление и TreeView обновляется.Если я передаю Tree.Leafs.elementAt (0) CurrentTree в usercontrol (используя другой корень DependencyProperty), уведомление запускается один раз, только когда загружен usercontrol.Если я изменяю CurrentTree, уведомление в ViewModel работает, но RootChanged () в UserControl не вызывается.Я не понимаю, почему.
Это код: MainWindow
<DockPanel>
<controls:TreeView Root="{Binding CurrentTree, Mode=TwoWay, diag:PresentationTraceSources.TraceLevel=High}">
</controls:TreeView>
</DockPanel>
ViewModel
private MyObject currentTree;
public MyObject CurrentTree
{
get
{
return currentTree;
}
set
{
if (currentTree == value) return;
currentTree = value;
NotifyPropertyChanged();
}
}
Код UserControl позади
public static readonly DependencyProperty RootProperty = DependencyProperty.Register("Root", typeof(MyObject), typeof(TreeView), new FrameworkPropertyMetadata(new PropertyChangedCallback(RootChanged)));
private static void RootChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((TreeView)d).Root= (MyObject)e.NewValue;
}
public MyObject Root
{
get
{
return (MyObject)GetValue(RootProperty);
}
set
{
SetValue(RootProperty, value);
}
}
TreeView (UserControl) xaml
<UserControl x:Class="MyControls.TreeView"
x:Name="TreeViewUserControl"
.....
<TextBlock Text="{Binding Root.Key, ElementName=TreeViewUserControl }" Height="16"/>
.....
</UserControl>
MainCon DataContext является ViewModel, я полагаю, что Datacontext из UserControl наследуется от MainView.TextBlock в UserControl используется для проверки DependencyProperty.
Это отладка привязки XAML:
System.Windows.Data Warning: 67 : BindingExpression (hash=14200498): Resolving source
System.Windows.Data Warning: 70 : BindingExpression (hash=14200498): Found data context element: TreeView (hash=49044892) (OK)
System.Windows.Data Warning: 78 : BindingExpression (hash=14200498): Activate with root item ViewModel (hash=49218346)
System.Windows.Data Warning: 108 : BindingExpression (hash=14200498): At level 0 - for ViewModel.CurrentTree found accessor ReflectPropertyDescriptor(CurrentTree)
System.Windows.Data Warning: 104 : BindingExpression (hash=14200498): Replace item at level 0 with ViewModel (hash=49218346), using accessor ReflectPropertyDescriptor(CurrentTree)
System.Windows.Data Warning: 101 : BindingExpression (hash=14200498): GetValue at level 0 from ViewModel (hash=49218346) using ReflectPropertyDescriptor(CurrentTree): MyObject (hash=52380055)
System.Windows.Data Warning: 80 : BindingExpression (hash=14200498): TransferValue - got raw value MyObject (hash=52380055)
System.Windows.Data Warning: 89 : BindingExpression (hash=14200498): TransferValue - using final value MyObject (hash=52380055)
Итак, я не понимаю, почему DependencyPropertyCallback запускается один раз.