WPF: привязка через пользовательское свойство зависимости - PullRequest
1 голос
/ 14 марта 2019

У меня есть TabControl, привязанный к Dictionary, и пользовательский элемент управления имеет значение ContentTemplate.У пользовательского элемента управления есть пользовательское свойство зависимости Schedules, и оно DataContext связано с ViewModel. Вот как это выглядит:

Основной элемент управления:

<TabControl Grid.Row="1"  ItemsSource="{Binding Schedules}">
    <TabControl.ContentTemplate>
        <DataTemplate>
            <TabControl >
                <TabItem Header="Scheduled flights">
                    <views:MyViewer Schedules="{Binding Value}"/>
                </TabItem>
            </TabControl>
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

ВMyViewer, у меня также есть DataGrid, который я хочу связать с Schedules, переданным от TabControl, но в то же время MyViewer имеет назначенный ViewModel.Вот как это выглядит в MyViewer:

<DataGrid Grid.Row="1" ItemsSource="{Binding RelativeSource={RelativeSource  Mode=FindAncestor, AncestorType=UserControl}, Path=Schedules}" AutoGenerateColumns="False" >

Пока это не работает, когда загружено MyViewer Schedules свойство равно null.Но даже если это сработает, я бы хотел, чтобы расписания передавались в ViewModel, а не в код.Одна идея состоит в том, чтобы заполнить словарь с ViewModels из MyViewer, но я не хочу этого делать, я только хочу, чтобы главный элемент управления знал о деталях MyViewer.Таким образом, есть какая-нибудь чистая идея, чтобы решить эту проблему?

РЕДАКТИРОВАТЬ: Предложение выше работает после изменения на ObservableDictionary, но остается вопрос, как получить Schedules в ViewModel

1 Ответ

0 голосов
/ 14 марта 2019

Если MyViewer имеет собственную ViewModel, вы не должны делать такие хаки, как это:

   ItemsSource="{Binding RelativeSource={RelativeSource  Mode=FindAncestor, 
   AncestorType=UserControl}, Path=Schedules}"

Таким образом MyViewer тесно связан с другим элементом управления.

ImНа мой взгляд, в этом случае MyViewer's ViewModel должен иметь собственное свойство Schedules.Как вы могли бы синхронизировать TabControl ViewModel's Schedules и MyViewer ViewModel's Schedules?Это зависит от вашей системы, но вы можете попробовать следующие идеи:

  • Отправка сообщений уровня ViewModel, как в MVVM Light, при добавлении или удалении элементов. Пример в этом сообщении в блоге
  • Попробуйте реализовать какой-нибудь магазин, например, в NgXs или NgRx в Angular
  • Возможно, вам не нужно синхронизировать расписания - зависитв вашей системе?:)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...