WPF数据绑定单例属性(来自多个Windows)

时间:2010-09-19 17:10:11

标签: wpf binding user-controls singleton

编辑3:TLDR版本

我有一个单独的DependencyObject,我正在绑定UserControls。某些UserControl位于主窗口中,其中一些显示在单独的窗口(设置窗口)中。出现在设置窗口中的那些不正确绑定,不会影响单例中的值。


我有一个单身DependencyObject,我用它来存储应用程序范围的设置。我还有一个设置对话框,用户(理论上)可以使用它来控制单例内部的值。

该应用程序主要处理文档,因此我需要能够存储许多不同项目的字体设置。所以我创建了一个名为FontSettings的DependencyObject,它包含字体系列和字体大小之类的依赖属性。

我需要单独控制的每个“部分”项目都有不同的DependencyObject

因此,嵌套对象的整个结构看起来像:

MySettings
{
     PropertyGroup AProperties;
     PropertyGroup BProperties;
     PropertyGroup CProperties;
 }

 PropertyGroup
 {
      FontSettings FontStgs;
 }

每个PropertyGroup都是不同的DependencyObject,但它们都包含FontSettings对象。

所以,因为我知道我需要在许多地方显示FontSettings对象的设置控件,我创建了一个简单的UserControl来修改它们。我认为我可以简单地将UserControl的DataContext绑定到我希望它修改的FontSettings对象,因此,UserControl中的更改将反映在MySettings对象中(UserControl内部的控件是绑定到FontSettings的属性)。但是当我在UserControl的构造函数上设置断点时,DataContext在初始化后始终为null。

如果这个不够明确有用,请告诉我,我会发布实际代码。

以下是我在设置窗口中的XAML片段:

<local:FontSettingsControl DataContext="{Binding Source={x:Static stg:MySettings.Instance}, Path=PageHeaderSettings.CompanySettings}" />            

CompanySettings属于FontSettings类型。

TLDR版本: 我似乎无法正确绑定DataContext。如果是这样,我认为控件会正确影响设置。

我需要将DataContext指向CompanySettings DependencyObject。

CompanySettings对象的完整路径是:MySettings.Instance.PageHeaderSettings.CompanySettings

设置单身:MySingleton

修改

使用Snoop检查后,似乎没有设置DataContext。我的绑定表达式有问题吗?

编辑2:

似乎我的问题是由于我试图绑定的UserControls在一个不是主窗口的窗口中。当我将UserControl放在主窗口时,一切都按预期工作。那么,有没有人知道问题实际上是由什么造成的(我假设它的根源是线程)以及我应该如何继续设置窗口功能?

1 个答案:

答案 0 :(得分:0)

您是否真的在运行时遇到问题?通过检查构造函数中的值进行测试的方式不会告诉您任何事情,因为Bindings中的值在控件完成初始化并加载之后才会设置。即使您在XAML中的控件实例上设置了本地值而不是Binding,它也会在构造函数退出后发生(就像执行new FontSettingsControl() { DataContext = myData });一样)。而是尝试使用Snoop在运行时检查DataContext值。