2017-03-24 143 views
1

我在UserControl中有一個TreeView,它可以滾動+縮放和拖動。 (由於樹視圖確實非常大),由於滾動/縮放/拖動用戶控件聽WPF將DependencyProperty綁定到另一個DependencyProperty

  1. OnScrollViewerScrollChanged
  2. OnMouseLeftButtonUp
  3. OnMouseLeftButtonUp
  4. OnPreviewMouseWheel
  5. OnMouseLeftButtonDown在
  6. 的OnMouseMove

TreeViewItems無法接收任何鼠標輸入。因此,我爲TreeViewItem創建了一個DependencyProperty,所​​謂的IsMouseHover。如果鼠標進入或離開TreeViewItem,那DP就會在true和false之間切換。

ScrollZoomDrag UserControl也有一個DP,即所謂的「Active」,它訂閱或取消訂閱上面提到的所有事件。

現在我想將TreeViewItem的「IsMouseHover」綁定到ScrollZoomDrag的Control「Active」DP。

<controls:ScrollDragZoomControl> 
    <controls:OrgTreeView ItemsSource="{Binding Root}"> 
     <controls:OrgTreeView.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding Children, Mode=TwoWay}"> 
       <controls:VisualElement DataContext="{Binding}"> 
        <Style TargetType="controls:ScrollDragZoomControl"> 
         <Style.Triggers> 
          <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=controls:VisualElement}, Path=IsMouseHover}" Value="True"> 
           <Setter Property="Active" Value="False" /> 
          </DataTrigger> 
          <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=controls:VisualElement}, Path=IsMouseHover}" Value="False"> 
           <Setter Property="Active" Value="True" /> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 
       </controls:VisualElement> 
      </HierarchicalDataTemplate> 
     </controls:OrgTreeView.ItemTemplate> 
    </controls:OrgTreeView> 
</controls:ScrollDragZoomControl> 

使用上面的解決方案,ScrollZoomDrag的DP「Active」根本不會被切換。我錯過了什麼,或者有更好的方法嗎?

UPDATE

ScrollZoomDrag.xaml.cs

 public static readonly DependencyProperty ActiveProperty = DependencyProperty.Register("Active", typeof(bool), typeof(ScrollDragZoomControl), new PropertyMetadata(true, new PropertyChangedCallback(ActiveChanged))); 

    public bool Active 
    { 
     get { return (bool)GetValue(ActiveProperty); } 
     set { SetValue(ActiveProperty, value); } 
    } 

    public static void ActiveChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) 
    { 
     ScrollDragZoomControl scrollDragZoomControl = (ScrollDragZoomControl)obj; 

     if ((bool)args.NewValue) 
      scrollDragZoomControl.StartListen(); 
     else scrollDragZoomControl.StopListen(); 
    } 

VisualElement.xaml.cs

 public static readonly DependencyProperty IsMouseHoverProperty = DependencyProperty.Register("IsMouseHover", typeof(bool), typeof(VisualElement), new PropertyMetadata(false)); 

    public VisualElement() 
    { 
     InitializeComponent(); 
     MouseEnter += VisualElement_MouseEnter; 
     MouseLeave += VisualElement_MouseLeave; 
    } 

    public bool IsMouseHover 
    { 
     get { return (bool)GetValue(IsMouseHoverProperty); } 
     set { SetValue(IsMouseHoverProperty, value); } 
    } 

    private void VisualElement_MouseLeave(object sender, MouseEventArgs e) 
    { 
     IsMouseHover = false; 
    } 

    private void VisualElement_MouseEnter(object sender, MouseEventArgs e) 
    { 
     IsMouseHover = true; 
    } 

方法2:(也不起作用)

<controls:ScrollDragZoomControl> 
    <controls:ScrollDragZoomControl.Style> 
     <Style TargetType="controls:ScrollDragZoomControl"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=controls:VisualElement}, Path=IsMouseHover}" Value="True"> 
        <Setter Property="Active" Value="False" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </controls:ScrollDragZoomControl.Style> 
    <controls:OrgTreeView ItemsSource="{Binding Root}" 
          HorizontalAlignment="Center" 
          VerticalAlignment="Center"> 
     <controls:OrgTreeView.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding Children, Mode=TwoWay}"> 
       <controls:VisualElement DataContext="{Binding}">     
       </controls:VisualElement> 
      </HierarchicalDataTemplate> 
     </controls:OrgTreeView.ItemTemplate> 
    </controls:OrgTreeView> 
</controls:ScrollDragZoomControl> 
+0

當前'