簡體   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