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