2016-07-05 11 views
0

TreeViewSelectedItem이라는 첨부 속성이 있습니다. 왜 내가이 연결된 속성이 필요한지에 대한 세부 정보가 너무 많지는 않지만 TreeView에서 선택된 항목의 유형에 따라 내 VM에서 다른 속성을 업데이트해야하는 것과 관련이 있다고 말합니다.첨부 된 속성의 내부에서 속성 값 설정

내 문제는 내 코드가 VM의 속성을 업데이트하는 것처럼 보이지 않는 것입니다.

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> 

내 부속 건물 : 하단에서

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); 
     } 

    } 

, 나는이 연결된 속성가 결합되어 어떤 업데이 트를 시도하기 위해 다양한 방법을 시도했지만 VM 속성의 Set 메서드 (중단 점에 도달하지 않음)에 충돌하지 않는 것 같습니다.

어떻게 해당 속성을 업데이트합니까?

+0

그냥 친절한 의견 : 당신이 이벤트에 가입하지 않으면 구독을 잊지 마세요. 너에게 질문한다. Treeview에서 파생 된 클래스를 만들고 'SelectedItem'- Property – lokusking

+0

@lokusking을 오버라이드하는 것이 더 쉽습니다. 구독 취소를 잘 잡으십시오. 이 코드는 테스트 코드 일 뿐이므로 걱정하지 않았습니다.하지만이 코드를 사용하는 사람은 제외하지 않는 것이 중요합니다. 그리고 당신 말이 맞습니다. TreeView를 서브 클래 싱하는 것이이 시점에서 더 쉬울 수도 있습니다. –

+0

재미있는 점은 Treeview는이 속성으로 아직 읽기 전용입니다. [이] (http://stackoverflow.com/questions/1000040/data-binding-to-selecteditem-in-a-wpf-treeview) 더 많은 desicions에 당신을 도울 수 – lokusking

답변

0

해결책은 1 : SetTreeViewSelectedItem(tree, tree.SelectedItem); (내 의견을 말한) 및 2 : 바인딩에서 Mode = TwoWay를 사용하십시오.

내가 여기에서 수행하려고하는 것을 해결하려는 다른 방법은 TreeView의 IsSelected 속성을 사용하고 기본 VM의 일부 부울 속성에 바인딩하는 것입니다. 이것은 많은 사람들 (Julien과 Maverik 같은)에 의해 지적되었습니다. 아주 특별한 상황에서 사용할 수는 없지만 99.9 %의 상황에서이 방법을 사용합니다.