UWP-将事件传递给控件(隧道)

时间:2019-03-29 13:48:38

标签: c# wpf events uwp

我有一个关于从父视图到子控件继承/传递事件到用户控件的UWP问题。

我创建了一个用于显示文本叠加层的用户控件(请参见下面的代码)。我们有一个父视图,该父视图将在调整窗口大小时显示一个叠加层(请参见下面的代码)。触发偶数时,叠加层将显示窗口的尺寸。

我将叠加层移到了用户控件上,现在我试图将调整大小的事件传递给叠加层控件。希望我们可以向叠加层控件注册更多事件,以便它可以显示比调整大小还要多的事件 信息。但是,我不确定执行此操作的最佳方法。我的第一个想法是从视图继承,因此我只能从overlay控件监听事件,但这会导致错误。 我相信由于父视图具有ViewModel的事实(我也为叠加层创建了一个ViewModel,不确定是否实际需要它)。 我一直在阅读许多这样做的方法,但是我不确定哪种方法是最好的方法。有人对这个问题有见识吗?我愿意接受建议,链接或以下方面的一般性答复: 在我们的项目中实现此目标的最佳方法是什么?

父视图

enter image description here

用户控制

enter image description here

家长活动 enter image description here

控制类

enter image description here

我一直在阅读的一些信息:

https://documentation.devexpress.com/WPF/17449/MVVM-Framework/ViewModels/ViewModel-relationships-ISupportParentViewModel

https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/preview-events

https://social.msdn.microsoft.com/Forums/windows/en-US/742077f6-e875-44d1-8bc4-6e6516db9eda/passing-the-parent-control-event-to-child-controls?forum=winforms

https://docs.microsoft.com/en-us/windows/uwp/xaml-platform/events-and-routed-events-overview

http://irisclasson.com/2013/12/10/passing-event-arguments-from-xaml-in-windows-store-apps-inputconverter-inputconverterparameter-etc/

https://docs.microsoft.com/en-us/windows/uwp/launch-resume/how-to-create-and-consume-an-app-service

更新 将viewModel添加到父viewModel(终端),并通过Datacontext将其传递给控件不起作用

2 个答案:

答案 0 :(得分:2)

由于您已经在使用MVVM,因此建议您使用“交互性”,“命令”和“子ViewModels”进行完整的路由。这是MVVM WPF应用程序中常用的模式,也可以应用于UWP应用程序。

使用“互动性”和互动方式

Microsoft的交互性/行为库允许您将XAML中的事件绑定到collectionView中的ICommand。您可以获取托管的NuGet软件包here

从官方examples on GitHub缩短:

ViewModel

将命令数据转发到子ViewModel

现在已将此事件路由到父视图模型中的命令,您现在可以调用叠加视图模型并将信息直接传递给它:

<Button x:Name="button1" Content="Increment">
  <Interactivity:Interaction.Behaviors>
    <Interactions:EventTriggerBehavior EventName="Click" SourceObject="{Binding ElementName=button1}">
      <Interactions:InvokeCommandAction Command="{Binding UpdateCountCommand}"/>
    </Interactions:EventTriggerBehavior>
  </Interactivity:Interaction.Behaviors>
</Button>

或者您使用Messenger(mediator pattern)将其发送到叠加层。

答案 1 :(得分:0)

我在滥用绑定。 x:Bind和Binding使用不同类型的上下文。为了使绑定生效,我们需要将父元素的Datacontext设置为“ this”。 x:Bind相反地这样做。

<views:OverlayView DataContext="{x:Bind ViewModel.Overlay}"></views:OverlayView>