我在WPF应用程序中使用CaliburnMicro,该应用程序使用WindowsAPICodePack(Microsoft-WindowsAPICodePack-Shell和Microsoft-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();
}
}
任何见识都会受到赞赏。