如何在WPF中检测TreeNode扩展?

时间:2012-04-15 12:05:26

标签: c# wpf xaml treeview

我正在使用MVVM将分层树结构绑定到WPF中的TreeView。我正在使用XAML代码,如下所示:

<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节点)进行一些检查,可能会询问用户是否确定(如果操作将占用大量内存并取消扩展。

我该怎么做?

1 个答案:

答案 0 :(得分: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的{​​{1}} {1}}并在项目类中使用事件处理程序,例如Expander

注意:这样,您只能拦截用户点击展开按钮[+]触发的扩展事件。您需要几个键盘快捷键来实现对自己的支持。

HTH,