C#WPF Caliburn Micro TreeViewItem.Expanded事件未触发

问题描述 投票:2回答:1

我正在使用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
    }
c# wpf mvvm treeview caliburn.micro
1个回答
1
投票

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>
© www.soinside.com 2019 - 2024. All rights reserved.