Как лучше всего обмениваться данными между окном WPF и его пользовательскими элементами управления?

WPF иногда может приводить в бешенство.

У меня есть довольно простое приложение, состоящее из одного главного окна, содержащего элемент управления вкладками и несколько вкладок. Мне не понравилась идея иметь код для всех вкладок в одном файле, поэтому я использовал ответ из этого вопроса , чтобы выделить каждую вкладку в отдельный пользовательский элемент управления.

В моем главном окне у меня есть экземпляр объекта, который содержит настройки приложения и некоторые другие данные всего приложения. Некоторым из моих вкладок требуется доступ к этим данным для привязки данных. Я не смог найти хорошего способа добиться этого.

Сначала я попытался получить доступ к родительскому окну в событии Control Loaded и получить ссылку на свойство в главном окне, которое предоставляет объект настроек, как показано в приведенном ниже коде. Это работает, за исключением того, что событие Loaded запускается каждый раз, когда вкладка получает фокус. Кроме того, это событие происходит в конце жизненного цикла элемента управления, поэтому я не могу выполнить привязку ни к одному из свойств этого объекта в пользовательских элементах управления XAML.

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

Затем я поэкспериментировал с передачей данных в конструктор пользовательских элементов управления, но в XAML это невозможно.

Учитывая, что это параметры для всего приложения, я мог бы сделать класс ApplicationSettings одноэлементным и ссылаться на него повсюду, но я бы предпочел не делать этого для целей модульного тестирования.

Так как же достичь такого результата? Мой подход ошибочен в корне? На мой взгляд, все эти элементы пользовательского интерфейса являются частью одного окна и, следовательно, должны иметь возможность доступа к данным из главного окна, но объектная модель, похоже, не позволяет этого.

7
задан Community 23 May 2017 в 12:17
поделиться