WPF иногда может приводить в бешенство.
У меня довольно простое приложение, которое состоит из одного главного окна, которое содержит элемент управления вкладками и несколько вкладок. Мне не понравилась идея иметь код для всех вкладок в одном файле, поэтому я использовал ответ из этого вопроса , чтобы разбить каждую вкладку на отдельный пользовательский элемент управления.
Внутри моего главного окна у меня есть экземпляр объекта, который содержит настройки приложения и некоторые другие данные приложения. Некоторые из моих вкладок требуют доступа к этим данным для привязки данных. Я не смог найти хороший способ сделать это.
Сначала я попытался получить доступ к родительскому окну в событии Loaded для элементов управления и получить ссылку на свойство в главном окне, которое отображает объект настроек, как показано в коде ниже. Этот вид работ, за исключением события Loaded, запускается каждый раз, когда вкладка получает фокус. Кроме того, это событие происходит в конце жизненного цикла элемента управления, поэтому я не могу привязать ни одно из свойств этого объекта в пользовательском элементе управления XAML.
private void MyUserControl_Loaded(object sender, RoutedEventArgs e)
{
this.ApplicationSettings = ((MainWindow)Window.GetWindow(this)).ApplicationSettings;
}
Затем я экспериментировал с передачей данных в конструктор пользовательских элементов управления, но в XAML этого не было.
Учитывая, что это настройки для всего приложения, я мог бы сделать синглтон класса ApplicationSettings и ссылаться на него везде, но я бы предпочел не делать этого для целей модульного тестирования.
Так, как можно сделать что-то подобное? Является ли мой подход в корне ошибочным? На мой взгляд, все эти элементы пользовательского интерфейса являются частью одного и того же окна и, следовательно, должны иметь возможность доступа к данным из главного окна, но объектная модель, по-видимому, не позволяет этого.