Свойства одиночного привязки данных WPF (из нескольких окон) - PullRequest
0 голосов
/ 19 сентября 2010

Редактировать 3: TLDR-версия

У меня есть синглтон DependencyObject, к которому я привязываю пользовательские элементы управления Некоторые из пользовательских элементов управления находятся в главном окне, некоторые из них отображаются в отдельном окне (окно настроек). Те, которые появляются в окне настроек, не связываются правильно и не влияют на значения в синглтоне.


У меня есть синглтон DependencyObject, который я использую для хранения настроек всего приложения. У меня также есть диалоговое окно настроек, которое пользователь (теоретически) сможет использовать для управления значениями внутри синглтона.

Приложение в основном работает с документами, поэтому мне нужно иметь возможность сохранять настройки шрифта для ряда различных элементов. Поэтому я создал объект DependencyObject с именем FontSettings, он содержит свойства зависимостей для таких вещей, как семейство шрифтов и размер шрифта.

Для каждого «раздела» предметов, которые мне нужно контролировать отдельно, есть разные DependencyObject.

Итак, вся структура вложенных объектов выглядит примерно так:

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

 PropertyGroup
 {
      FontSettings FontStgs;
 }

Каждый PropertyGroup является отдельным DependencyObject, но все они будут содержать объект FontSettings.

Итак, поскольку я знаю, что мне нужно будет отображать элементы управления настройками для объектов FontSettings во многих местах, я создал простой UserControl для их изменения. Я думал, что смогу просто привязать DataContext UserControl к объекту 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 указывал на объект DependencyObjectSettings.

Полный путь к объекту CompanySettings: MySettings.Instance.PageHeaderSettings.CompanySettings

Настройки синглтона: MySingleton

Edit:

После проверки с помощью Snoop кажется, что DataContext не устанавливается. Что-то не так с моим обязательным выражением?

Редактировать 2:

Кажется, моя проблема связана с тем, что пользовательские элементы управления, к которым я пытаюсь привязаться, находятся в окне, которое НЕ является главным окном. Когда я разместил UserControl в главном окне, все работало как положено. Итак, кто-нибудь знает, чем на самом деле вызвана проблема (я полагаю, что она имеет корни в потоке) и как мне выполнить функцию окна настроек?

1 Ответ

0 голосов
/ 20 сентября 2010

У вас действительно возникают проблемы во время выполнения? То, как вы тестируете, проверяя значение в конструкторе, ничего не скажет, потому что значения из Bindings не устанавливаются до тех пор, пока не завершится инициализация и загрузка элемента управления. Даже если вы устанавливаете локальное значение вместо Binding для экземпляра вашего элемента управления в XAML, оно произойдет после выхода из конструктора (точно так же, как при выполнении new FontSettingsControl() { DataContext = myData });). Вместо этого попробуйте использовать Snoop для проверки значений DataContext во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...