Как перехватывать события из элемента управления WindowsApiCodePack ExplorerBrowser в viemodel? - PullRequest
0 голосов
/ 04 июля 2019

Я использую 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();
        }
    }

Любое понимание будет оценено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...