繁体   English   中英

在WPF窗口和用户控件之间共享数据的最佳方法是什么?

[英]What is the best way to share data between a WPF window and its User Controls?

WPF有时会令人愤怒。

我有一个相当简单的应用程序,它包含一个主窗口,其中包含一个选项卡控件和几个选项卡。 我不喜欢在同一个文件中使用所有选项卡的代码的想法,因此我使用此问题的答案将每个选项卡分成单独的用户控件。

在我的主窗口中,我有一个包含应用程序设置的对象实例,以及一些其他应用程序范围的数据。 我的一些标签需要访问此数据以进行数据绑定。 我无法找到实现这一目标的好方法。

首先,我尝试访问控件Loaded事件中的父窗口,并在主窗口中获取对公开设置对象的属性的引用,如下面的代码所示。 除了Loaded事件之外,每次选项卡获得焦点时都会触发此类工作。 此外,此事件发生在控件生命周期的后期,因此我无法在用户控件XAML中绑定到此对象中的任何属性。

private void MyUserControl_Loaded(object sender, RoutedEventArgs e)
{
    this.ApplicationSettings = ((MainWindow)Window.GetWindow(this)).ApplicationSettings;
}

然后我尝试将数据传递给用户控件构造函数,但是在XAML中无法做到这一点。

鉴于这些是应用程序范围的设置,我可以使ApplicationSettings类单例并在任何地方引用它,但我宁愿不为单元测试目的这样做。

那么如何才能实现这样的目标呢? 我的方法是否存在根本缺陷? 在我看来,所有这些UI元素都是同一窗口的一部分,因此应该能够从主窗口访问数据,但对象模型似乎不允许这样做。

您可以将设置对象放入包装类中的静态属性(此示例中为SettingsHolder ,并通过应用程序引用它

在XAML中:

{Binding SettingName, Source={x:Static local:SettingsHolder.Settings}}

local是您的SettingsHolder类所在的命名空间。

代码:

var x = SettingsHolder.Settings.SettingName;
SettingsHolder.Settings.SettingName = x;

在用户控件的声明中,您可以将数据上下文设置为包含您需要绑定的所有内容的对象实例!

<someNamespace:EricsUserControl DataContext="{Binding InstanceOfBindingObject}"/>

然后,您可以像往常一样访问用户控件中该对象实例的属性。

我要做的就是用一个FrameTab放置一个PageFrame (但我认为同样适用于用户控件)。 构造函数仅在创建页面时触发,您可以控制何时创建页面,并且可以在构造函数中传递信息。 页面包含更多生命周期事件。 我还使用Loaded事件来构建UI(它只触发一次)。 如果您在XAML中绑定页面,它将在您启动应用程序时触发,并且您无法传递信息。 这是创建一个页面并在对话框中显示它,但该页面可以绑定到一个框架。

        NavigationWindow winSearchXML;
        using (new WaitCursor())
        {
            winSearchXML = new NavigationWindow();
            winSearchXML.Content = new PageSearchResultsXML(GabeLib.GetSearchXML(GabeLib.enumXMLtype.Flat));
        }
        winSearchXML.ShowDialog();

我需要说实话,有时我会在一个我不理解的页面上获得生命周期。 所以带上一粒盐。 但关键是你有结构和加载的事件可能会给你你需要的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM