我正在使用Caliburn Micro Message。通过XAML附加尝试将事件绑定到视图模型,但是无法触发TreeViewItem.Expanded
事件。其他事件,例如SetSelectedItem
,也可以正常工作。
我在SO here上发现了另一个问题,但由于没有提供响应的上下文,因此对我而言没有帮助。
我唯一能找到的其他信息是以下GitHub issue。
内部Caliburn.Micro转
<Button cm:Message.Attach="[Event Click] = [Action Test]" />
进入
<Button> <i:Interaction.Triggers> <i:EventTrigger EventName="Click"> <cm:ActionMessage MethodName="Test" /> </i:EventTrigger> </i:Interaction.Triggers> </Button>
如您所述,EventTrigger不支持附加事件。快速浏览一下How to attached an MVVM EventToCommand to an Attached event,其中显示了如何创建一个RoutedEventTrigger,您可以将其插入完整的语法。
同样,我尝试了这种方法,但是不完全了解如何实现此方法。它会在自定义类中触发事件,但永远不会传递给View Model中的处理程序。
这是我的XAML(无GitHub建议):
<TreeView x:Name="FolderView"
cal:Message.Attach="[Event TreeViewItem.Expanded] = [Action Expanded($this)];
[Event SelectedItemChanged] = [Action SetSelectedItem($this.SelectedItem)]">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type models:LogicalDriveItem}"
ItemsSource="{Binding Directories}" >
<StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" Text="{Binding Path=DriveLetter}"></TextBlock>
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type models:DirectoryItem}"
ItemsSource="{Binding Directories}">
<TextBlock VerticalAlignment="Center" Text="{Binding Path=Path}"></TextBlock>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
和我的视图模型代码:
public void Expanded(object sender, RoutedEventArgs e)
{
// This won't fire
}
public void Expanded(object sender)
{
// Or this
}
public void SetSelectedItem(object sender)
{
// But this will
}
mm8提供的链接解决了我的问题。
该问题中的OP使用的是与我在GitHub上找到的相同的RoutedEventTrigger帮助器类,但是他们的回答提供的其他上下文很有帮助。使用RoutedEventTrigger帮助器类,我将XAML更新为以下内容:
<i:Interaction.Triggers>
<!--in the routed event property you need to put the full name space and event name-->
<helpers:RoutedEventTrigger RoutedEvent="TreeViewItem.Expanded">
<cal:ActionMessage MethodName="Expanded">
<cal:Parameter Value="$eventArgs" />
</cal:ActionMessage>
</helpers:RoutedEventTrigger>
</i:Interaction.Triggers>
现在可以在ViewModel代码中成功触发我的事件。
请注意,$ this不适用于我,因为在我的情况下,数据项是字符串。就我而言,这是文件资源管理器样式的树视图。对于上下文,这是完整的XAML:
<TreeView x:Name="FolderView">
<i:Interaction.Triggers>
<!--in the routed event property you need to put the full name space and event name-->
<helpers:RoutedEventTrigger RoutedEvent="TreeViewItem.Expanded">
<cal:ActionMessage MethodName="Expanded">
<cal:Parameter Value="$eventArgs" />
</cal:ActionMessage>
</helpers:RoutedEventTrigger>
</i:Interaction.Triggers>
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type models:LogicalDriveItem}"
ItemsSource="{Binding Directories}" >
<StackPanel Orientation="Horizontal">
<!--<Image MaxWidth="20" Source="Images/Image.png"/>-->
<TextBlock VerticalAlignment="Center" Text="{Binding Path=DriveLetter}"></TextBlock>
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type models:DirectoryItem}"
ItemsSource="{Binding Directories}">
<TextBlock VerticalAlignment="Center" Text="{Binding Path=Name}"></TextBlock>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>