0

我正在使用 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 节点的树的节点做一些检查,可能会询问用户是否确定(如果操作会花费很多内存)并取消扩展。

我怎么做?

4

1 回答 1

1

此功能不是内置的,要实现此功能,您必须创建一个新控件TreeView,然后从扩展TreeViewItem.

实现这一目标涉及相当多的工作,所以我希望你能跟进;我不会解释所有内容,因此请提出问题或在 MSDN 上阅读您不了解的任何内容。

创建树视图

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. 您可以在 MSDN 上找到基本模板

为此,您需要从 MSDN 复制基本模板,将其更改TargetType{x:Type controls:TreeViewItemEx},然后将PreviewMouseDown事件添加到ToggleButton命名Expander并使用项目类中的事件处理程序,例如PreviewMouseDown="OnPreviewExpansionMouseDown"

注意:这将只允许您拦截由用户单击展开按钮 [+] 触发的展开事件。您需要几个键盘快捷键来为自己实现支持。

高温下,

于 2012-04-15T21:33:43.253 回答