2012-04-15 68 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