2012-04-15 47 views
0

我正在使用MVVM將分層樹結構綁定到WPF中的TreeView。我使用XAML代碼,它看起來像如下:如何檢測WPF中的TreeNode擴展?

<TreeView ScrollViewer.VerticalScrollBarVisibility="Auto" 
     BorderThickness="0" 
     ItemsSource="{Binding Items}" 
     DataContext="{Binding ElementName=UserControl, Mode=OneWay}"> 
     <TreeView.Resources> 
      <HierarchicalDataTemplate DataType="{x:Type local:MyStatistics}" ItemsSource="{Binding Items}" >      
        <TextBlock Text="{Binding Name}" /> 
      </HierarchicalDataTemplate> 
... 

我希望能夠到攔截節點擴展事件,並讓我的樹的節點,即綁定到正在擴大,TreeView的節點,做一些檢查,可能會詢問用戶是否確定(如果操作會佔用大量內存)並取消擴展。

我該怎麼做?

+0

您是否想知道如何做到這一點*,或者如何在沒有代碼隱藏的純MVVM中做到這一點? (做後者,如果你認爲它是值得的麻煩,將需要已經有辦法做前者。) – 2012-04-15 21:46:59

回答

1

此功能不是內置的,爲實現此目的,您必須創建一個從TreeView派生的新控件,然後再擴展TreeViewItem

實現這一點有一定的參與度,所以我希望你能跟上;我不會解釋所有的東西,所以提出問題或者在MSDN上閱讀任何你不懂的東西。

創建的TreeView

public class TreeViewEx : TreeView 
{ 

    protected override bool IsItemItsOwnContainerOverride(object item) 
    { 
     return (item is TreeViewItemEx); 
    } 

    protected override DependencyObject GetContainerForItemOverride() 
    { 
     return new TreeViewItemEx(this); 
    } 

    internal bool PreviewExpandTreeViewItem(TreeViewItemEx item) 
    { 
     // return true to allow expansion, false to cancel 
     return true; 
    } 

} 

public class TreeViewItemEx : TreeViewItem 
{ 
    private readonly TreeViewEx Owner; 

    static TreeViewItemEx() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(TreeViewItemEx), 
      new FrameworkPropertyMetadata(typeof(TreeViewItemEx))); 
    } 

    public TreeViewItemEx(TreeViewEx owner) 
    { 
     Owner = owner; 
    } 

    private void OnPreviewExpansionMouseDown(object sender, MouseButtonEventArgs e) 
    { 
     // we do not care if it already expanded 
     if (IsExpanded) 
      return; 

     e.Cancel = !Owner.PreviewExpandTreeViewItem(this); 
    } 

} 

現在,你要創建的默認樣式爲您的新TreeViewItemEx。你可以找到base template on MSDN

要做到這一點,你需要複製從MSDN的基本模板,改變TargetType{x:Type controls:TreeViewItemEx}然後PreviewMouseDown事件添加到ToggleButton命名爲Expander,並在項目類如使用事件處理程序PreviewMouseDown="OnPreviewExpansionMouseDown"

注意:這將只允許您攔截用戶點擊擴展按鈕[+]觸發的擴展事件。有幾個鍵盤快捷鍵需要你自己實現支持。

HTH,

+0

從TreeView降序似乎是矯枉過正。用附加的行爲你可能更容易做到這一點。 – 2012-04-15 21:45:58

+0

@JoeWhite:絕對你可以用附加的行爲來做到這一點,但是認爲在這個答案中太過先進的話題。 – Dennis 2012-04-15 22:07:46