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}追加し、アイテム クラスでイベント ハンドラーを使用する必要があります。PreviewMouseDownToggleButtonExpanderPreviewMouseDown="OnPreviewExpansionMouseDown"

注:これにより、ユーザーが展開ボタン [+] をクリックすることによってトリガーされた展開イベントのみをインターセプトできます。自分でサポートを実装するために必要なキーボード ショートカットがいくつかあります。

HTH、

于 2012-04-15T21:33:43.253 に答える