我有一个具有ItemTemplate/HierarchicalDataTemplate的TreeView。当我展开TreeViewItem时,我希望触发MessageBox。我目前遇到的问题是,尽管在ViewModel中的RelayCommand()
上命中断点,但实际的MessageBox不会执行。
我尝试在KeyViewModel本身内部移动命令,也发生了相同的行为。
可重现项目:https://github.com/MemeMachineSO/TreeViewProblem
XAML:
<Window x:Class="TreeViewProblem.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TreeViewProblem"
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<TreeView Grid.Row="1" Grid.Column="0" Name="RegistryTreeView" ItemsSource="{Binding Keys}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding SubKeys}">
<TreeViewItem Header="{Binding name}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Expanded">
<i:InvokeCommandAction Command="{Binding ElementName=RegistryTreeView, Path=DataContext.TreeViewItemExpanded}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</TreeViewItem>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</Grid>
</Window>
1条答案
按热度按时间dgiusagp1#
首先,在属性的getter中设置断点,
MessageBox.Show
方法在命令 * executes * 时调用,在InvokeCommandAction
绑定到属性本身时不调用。其次,
HierarchicalDataTemplate
不应该包含TreeViewItem
,控件创建自己的TreeViewItem
容器,模板中的Expanded
事件永远不会被触发。除非您为
TreeView
定义了一个(完整的)自定义模板,否则使用EventTrigger
在这里不起作用。相反,您可以定义一个
ItemContainerStyle
并以编程方式调用该命令:不,当您从同一个视图调用同一个命令时,这 * 不会 * 破坏MVVM模式。MVVM不是要消除代码,而是要分离关注点。无论您是从视图的代码隐藏调用视图模型命令,还是使用同一个视图的XAML标记中的
EventTrigger
和InvokeCommandAction
,都与模式无关。