繁体   English   中英

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

[英]C# WPF Caliburn Micro TreeViewItem.Expanded Event Not Firing

我正在使用 Caliburn Micro Message.Attach 通过 XAML 尝试将事件绑定到视图模型,但我无法触发TreeViewItem.Expanded事件。 SetSelectedItem等其他事件工作正常。

我在 SO here上发现了另一个关于此的问题,但在我的情况下没有帮助,因为没有提供响应的上下文。

我能找到的唯一其他信息是以下 GitHub问题

在内部 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 不支持附加事件。 快速浏览一下如何将 MVVM EventToCommand 附加到一个附加事件,它展示了如何创建一个可以插入完整语法的 RoutedEventTrigger。

同样,我尝试了这种方法,但并不完全了解如何实现这一点。 它在自定义类中触发事件,但永远不会传递给我在视图模型中的处理程序。

这是我的 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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM