2016-07-05 5 views
0

У меня есть свойство Attached, которое называется TreeViewSelectedItem. Не вдаваясь в слишком подробные сведения о том, зачем мне это приложенное свойство, я скажу, что это связано с необходимостью обновления различных свойств на моей виртуальной машине на основе того, какой тип элемента выбран в TreeView.Установка значения свойства из встроенного свойства

Моя проблема: я не могу заставить мой код обновлять свойство на виртуальной машине.

Установка XAML:

<TreeView ItemsSource="{Binding Lists}" l:BindableSelectedItemBehavior.TreeViewSelectedItem="{Binding SelectedListGroup}"> 

     <ItemsControl.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding }" > 
       <TextBlock Text="{Binding Key}"/> 
       <HierarchicalDataTemplate.ItemTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding Key}"/> 
        </DataTemplate> 
       </HierarchicalDataTemplate.ItemTemplate>      
      </HierarchicalDataTemplate> 
     </ItemsControl.ItemTemplate> 
    </TreeView> 

Мой Attached Property:

public static object GetTreeViewSelectedItem(DependencyObject obj) 
    { 
     return (object)obj.GetValue(TreeViewSelectedItemProperty); 
    } 

    public static void SetTreeViewSelectedItem(DependencyObject obj, object value) 
    { 
     obj.SetValue(TreeViewSelectedItemProperty, value); 
    } 

    // Using a DependencyProperty as the backing store for TreeViewSelectedItem. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty TreeViewSelectedItemProperty = 
     DependencyProperty.RegisterAttached("TreeViewSelectedItem", typeof(object), typeof(BindableSelectedItemBehavior), new UIPropertyMetadata(null, 
      (s,a) => 
      { 
       TreeView tree = s as TreeView; 

       if (tree == null) 
        return; 

       if (a.NewValue != null) 
       { 
        tree.SelectedItemChanged += tree_SelectedItemChanged; 
        tree.SourceUpdated += tree_SourceUpdated; 
       } 
       else 
       { 

       } 

      })); 

    static void tree_SourceUpdated(object sender, System.Windows.Data.DataTransferEventArgs e) 
    { 
     throw new NotImplementedException(); 
    } 

    static void tree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
    { 
     TreeView tree = sender as TreeView; 
     object binding; 
     BindingExpression bindingExp; 

     if (tree == null) 
      return; 

     bindingExp = BindingOperations.GetBindingExpression(tree, BindableSelectedItemBehavior.TreeViewSelectedItemProperty); 
     binding = GetTreeViewSelectedItem(tree); 

     if (binding == null) 
      return; 

     if (binding.GetType() == e.NewValue.GetType()) 
     { 
      System.Diagnostics.Debug.WriteLine("Type match"); 
      binding = tree.SelectedItem; 
      //tree.SetValue(BindableSelectedItemBehavior.TreeViewSelectedItemProperty, tree.SelectedItem); 
      //SetTreeViewSelectedItem(tree, tree.SelectedItem); 
      tree.SetCurrentValue(BindableSelectedItemBehavior.TreeViewSelectedItemProperty, tree.SelectedItem); 
     } 

    } 

На дне, я попробовал много разных способов, чтобы попытаться обновление бы это вложенное свойство привязывается к а он, похоже, не попадает в метод Set свойства VM (не попадает в точку останова).

Как обновить это свойство?

+0

Просто дружественный комментарий: Если вы подписаны на мероприятие, не забудьте отказаться от использования. Вам вопрос. Вероятно, проще создать класс, полученный из Treeview, и переопределить 'SelectedItem'- Свойство – lokusking

+0

@lokusking, хорошо поймать отмену подписки. Это всего лишь тестовый код, поэтому я не беспокоился об этом, но для тех, кто смотрит на это, это действительно важно НЕ Оставить! И вы правы, на данный момент может быть проще подклассифицировать TreeView. –

+0

Самое смешное, что Treeview как это свойство, но только для чтения. [Это] (http://stackoverflow.com/questions/1000040/data-binding-to-selecteditem-in-a-wpf-treeview) может помочь вам в дальнейших действиях – lokusking

ответ

0

Как оказалось, решение было 1: использовать SetTreeViewSelectedItem(tree, tree.SelectedItem); (который я прокомментировал) и 2: использовать режим = TwoWay в привязке.

Отмечу, что другой подход к решению того, что я пытаюсь сделать здесь, - использовать свойство IsSelected TreeView и привязать его к некоторому логическому свойству на базовых виртуальных машинах. Об этом говорили многие люди (такие как Жюльен и Маверик). Хотя я не мог использовать его в моей особой ситуации, это способ пойти в 99,9% ситуаций.

Смежные вопросы