c# - 如何处理在不同页面上发生的事件

标签 c# xaml uwp

到目前为止,我有一个包含 2 页的 UWP 项目。 MainPage.xaml 是应用程序的基本布局(汉堡菜单、搜索栏等)。此 MainPage 的另一部分包含一个框架,其中加载了另一个页面 LandingPage.xaml。我想从 MainPage.xaml 中的 AutosuggestBox 捕获用户输入,并在 LandingPage.xaml(位于 MainPage.xaml 中的框架中)上显示结果。

我尝试继承 MainPage,但这是不允许的。

最佳答案

虽然 Marian 的回答肯定有效,但我认为它远非“干净”或“好”代码。

首先,您应该在您的 UWP 应用程序中实现 MVVM 模式(如果您尚未实现)并为此使用依赖注入(inject)框架。一个非常基本、易于理解的框架是 MVVMLight,而一个更复杂的选择框架可能是 Autofac。我建议您从前者开始,先了解它要快得多。

在 MVVM 中,有一个概念可以解决您的问题:信使。我不想在这里深入细节,因为已经有很多比我聪明得多的人写的非常好的资源。例如这篇来自 MVVMLight 作者本人的文章:https://msdn.microsoft.com/en-us/magazine/jj694937.aspx (我知道它是从 2013 年开始的,谈论的是 Windows 8,但不要害怕,概念是一样的。)

想法是,不同的 ViewModel 不应该相互严格依赖 - 这使得单元测试(这是首先进行 MVVM 的要点之一)变得困难。因此,在您的情况下,您应该有两个 ViewModel:MainViewModel 和 LandingViewModel。一个用于 MainPage,一个用于 LandingPage。现在,您应该在 MainPage 的代码隐藏中为 AutoSuggestBox 的 QuerySubmitted 事件实现一个处理程序,并在 MainViewModel 中调用一个函数。在该函数中,您将使用来自 AutoSuggestBox 的字符串实例化一条新消息(您可以通过对其进行数据绑定(bind)或通过 QuerySubmitted 的事件处理程序获取该字符串,这取决于您)并通过 Messenger 发送它。在 LandingViewModel 中,您将订阅这条确切的消息,然后只需几行代码即可通过 LandingPage 上的数据绑定(bind)显示接收到的消息。

我知道对于像这样非常基本的事情来说看起来很麻烦,尤其是当你将它与 Marian 的直截了当的解决方案进行比较时。但请相信我,从长远来看,编写干净的代码、很好地分离、易于单元测试的 ViewModels 将弥补您最初为使它们工作而必须投入的额外工作。在两个 ViewModel 之间设置这样的系统后,添加第三个(我认为您很快就会需要这样做)绝对是微不足道的,并且可以很快完成。

关于c# - 如何处理在不同页面上发生的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44195387/

相关文章:

c# - ComboBox SelectedItem 绑定(bind)

c# - 为什么 (object)0 == (object)0 不同于 ((object)0).Equals((object)0)?

具有不同文档的 WPF Devexpress Documentgroup

wpf - wpf中的HeaderedContentControl有什么用?

c# - InkCanvas 保存产生错误的尺寸

xaml - 如何在 XAML 中的 TextBlock 末尾添加空格? (Windows 10,UWP)

c# - HtmlAgility :no contents appeared (C#, UWP)

c# - 为什么 Environment.NewLine = "\r\n"而字符串文字中的 "\n"功能相同?

c# - DownloadData() 生成不同于浏览器的 HTML

c# - NSubstitute 无法确定要使用的参数规范