我有一个关于从父视图到子控件继承/传递事件到用户控件的UWP问题。
我创建了一个用于显示文本叠加层的用户控件(请参见下面的代码)。我们有一个父视图,该父视图将在调整窗口大小时显示一个叠加层(请参见下面的代码)。触发偶数时,叠加层将显示窗口的尺寸。
我将叠加层移到了用户控件上,现在我试图将调整大小的事件传递给叠加层控件。希望我们可以向叠加层控件注册更多事件,以便它可以显示比调整大小还要多的事件 信息。但是,我不确定执行此操作的最佳方法。我的第一个想法是从视图继承,因此我只能从overlay控件监听事件,但这会导致错误。 我相信由于父视图具有ViewModel的事实(我也为叠加层创建了一个ViewModel,不确定是否实际需要它)。 我一直在阅读许多这样做的方法,但是我不确定哪种方法是最好的方法。有人对这个问题有见识吗?我愿意接受建议,链接或以下方面的一般性答复: 在我们的项目中实现此目标的最佳方法是什么?
父视图
用户控制
控制类
我一直在阅读的一些信息:
https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/preview-events
https://docs.microsoft.com/en-us/windows/uwp/xaml-platform/events-and-routed-events-overview
https://docs.microsoft.com/en-us/windows/uwp/launch-resume/how-to-create-and-consume-an-app-service
更新 将viewModel添加到父viewModel(终端),并通过Datacontext将其传递给控件不起作用
答案 0 :(得分:2)
由于您已经在使用MVVM,因此建议您使用“交互性”,“命令”和“子ViewModels”进行完整的路由。这是MVVM WPF应用程序中常用的模式,也可以应用于UWP应用程序。
Microsoft的交互性/行为库允许您将XAML中的事件绑定到collectionView
中的ICommand
。您可以获取托管的NuGet软件包here。
从官方examples on GitHub缩短:
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>