DependencyProperty, UserControl, CallBack срабатывает один раз - PullRequest
1 голос
/ 26 сентября 2019

Я использую элемент управления 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 запускается один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...