Я использую CaliburnMicro в своем приложении WPF, которое использует элемент управления ExplorerBrowser из WindowsAPICodePack ( Microsoft-WindowsAPICodePack-Shell и Microsoft-WindowsAPICodePack-Core ).
События, подобные SelectionChanged
, прикрепленные к этому элементу управления, не запускаются в модели представления.
Я пытался сделать это несколькими способами с помощью [Event] = [Action()]
Калибурна, или сделать более простое событие в стиле "WinForms" для базового класса представления - ни один из них не сработал.
События Caliburn работают нормально для любых других элементов управления в представлении. Поэтому, если я помещаю событие в родительскую сетку - это работает.
Единственный способ, которым я обнаружил, что он работает, - это получить доступ к самому элементу управления по имени из выделенного кода, а это не то, что я хочу делать.
Мне также не совсем понятен синтаксис события Caliburn в этом случае, потому что он доступен через Selector - [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();
}
}
Любое понимание будет оценено.