【问题标题】:How to raise a custom event from child UserControl to parent control in AvaloniaUI如何在 AvaloniaUI 中将自定义事件从子 UserControl 引发到父控件
【发布时间】:2020-12-16 22:14:14
【问题描述】:

在 dotnet 的 Avalonia-UI 框架中。 我有一个UserControl,它是一个带有“关闭”按钮的“关于”弹出视图,应该向父控件发出一个自定义事件,以指示弹出窗口应该由其父窗口关闭。

到目前为止,我似乎几乎拥有它,但我找不到引发事件的方法。 这就是我所拥有的:

AboutView.axaml我有:

<UserControl ... >
  <Button  Command="{Binding OnCloseView}" >Close</Button>

AboutViewModel.cs我定义了一个ReactiveCommand:

public ReactiveCommand<Unit, Unit> OnCloseView { get; }

public AboutViewModel()
{
    OnCloseView = ReactiveCommand.Create(() => { });
}

AboutView.axaml.cs后面的代码中我有:

public AboutView(AboutViewModel viewModel = null)
        {
            this.InitializeComponent();
            var dataContextViewModel = viewModel ?? new AboutViewModel();
            this.InitializeComponent();
            // ...
            dataContextViewModel.OnCloseView.Subscribe(x => {
                var eventArgs = new RoutedEventArgs();

// How do I raise the ExitView event from here?

                //this.RaiseEvent(eventArgs); // This didn't work, throws null reference exception.

                // This didn't work:
                //EventHandler handler = ExitView;
                //handler?.Invoke(this, eventArgs);

                });
            this.DataContext = dataContextViewModel;
        }

        public static readonly RoutedEvent<RoutedEventArgs> ExitViewEvent =
            RoutedEvent.Register<AboutView, RoutedEventArgs>(nameof(ExitView), RoutingStrategies.Bubble);

        public event EventHandler<RoutedEventArgs> ExitView
        {
            add => AddHandler(ExitViewEvent, value);
            remove => RemoveHandler(ExitViewEvent, value);
        }

在父MainWindow.axaml:

<views:AboutView ExitView="SomeCodeBehindEventHandler"  IsVisible="{Binding $parent.DataContext.IsAboutVisible}"/>

在代码隐藏MainWindow.axaml.cs:

    public void OnAboutViewExitHandler(object sender, RoutedEventArgs e)
    {
        var viewModel = (MainWindowViewModel)this.DataContext;
        viewModel.OnCloseAboutPopup.Execute();
        e.Handled=true;
    }

我的问题是:

  • 如何从代码中引发 RoutedEvent “ExitView”?

  • 在 axaml 中是否有更好的方法将事件绑定到父视图模型中的 ReactiveCommand? 我找不到绑定它的方法,因为它无法编译:

<views:AboutView ExitView="{Binding OnCloseAboutPopup}"/>

如果我找不到更好的方法,那么我将不得不将一个函数传递给代码隐藏并从那里调用 ReactiveCommand。

  • 还有其他更好的方法可以将事件从子控件发送到父控件吗?

【问题讨论】:

    标签: c# .net-core avaloniaui


    【解决方案1】:

    您需要在构造事件参数时指定路由事件。

    var eventArgs = new RoutedEventArgs { RoutedEvent = ExitViewEvent };
    

    【讨论】:

    • 太好了,谢谢!这解决了第一个也是最重要的一点。我想知道这是否是正确或更简单的方法......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 2017-12-28
    相关资源
    最近更新 更多