如何从viemodel中的WindowsApiCodePack ExplorerBrowser控件捕获事件?

时间:2019-07-04 06:34:07

标签: c# .net wpf caliburn.micro windows-api-code-pack

我在WPF应用程序中使用CaliburnMicro,该应用程序使用WindowsAPICodePack(Microsoft-WindowsAPICodePack-ShellMicrosoft-WindowsAPICodePack-Core)中的ExplorerBrowser控件。

附加到此控件的事件SelectionChanged在视图模型中未触发。

我已经使用Caliburn的[Event] = [Action()]进行了多种尝试,或者对视图的后备类进行了更简单的“ WinForms”样式事件-这些都不起作用。

Caliburn事件对于视图中的任何其他控件都可以正常工作。因此,如果我在父网格上放置一个事件,那么它将起作用。

我发现它起作用的唯一方法是从代码后方通过名称访问控件本身,这不是我想要执行的操作。

在这种情况下,我也不太清楚Caliburn事件的语法,因为可以通过选择器-[Event Selector.SelectionChanged]来访问它。

我还尝试使用不同的arg类型和其他具有相同结果的事件来捕获它。

这里是视图:

<UserControl x:Class="App.WinExplorer.WinExplorerView"
      xmlns:WindowsAPICodePackPresentation="clr-namespace:Microsoft.WindowsAPICodePack.Controls.WindowsPresentationFoundation;assembly=Microsoft.WindowsAPICodePack.Shell"
      xmlns:cal="http://www.caliburnproject.org"
...
    <Grid>
        <WindowsAPICodePackPresentation:ExplorerBrowser 
            x:Name="ExplorerBrowser"
            NavigationTarget="{Binding NavigationTarget}"
            cal:Message.Attach="[Event Selector.SelectionChanged] = [Action SelectionChanged($this, $eventArgs)]"
            />
    </Grid>
</UserControl>

这是视图模型中的处理程序:

public void SelectionChanged(object s, SelectionChangedEventArgs e)
{
     // never hits this method
}

也尝试将事件宣布为真实WPF:

Selector.SelectionChanged="ExplorerBrowser_SelectionChanged"

实际上有效的方法,但是是一种落后的方法-在背后的代码中:

    public partial class WinExplorerView : UserControl
    {
        public WinExplorerView()
        {
            InitializeComponent();
            ExplorerBrowser.SelectedItems.CollectionChanged += SelectedItems_CollectionChanged;
        }

        private void SelectedItems_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            throw new System.NotImplementedException();
        }
    }

任何见识都会受到赞赏。

0 个答案:

没有答案