Как привязать содержимое элемента управления WPF к DataContext его контейнера, чтобы можно было применить DataTemplateSelector на основе этого объекта?
-
15-11-2019 - |
Вопрос
Я пытаюсь привязать окно WPF к ViewModel, содержащему две коллекции: A и B.Я пытаюсь использовать DataTemplates для отображения A или B в зависимости от настройки флага в моей ViewModel.
С этой целью я установил окно DataContext = ViewModel
.Однако, когда я пытаюсь связать ContentControl
к этому DataContext и примените DataTemplateSelector
к этому, item
параметр селектора SelectTemplate(object item, DependencyObject container)
метод всегда равен нулю:
<Window [snip] Title="MainWindow">
<Window.Resources>
<!-- DataTemplate and Selector declarations -->
</Window.Resources>
<Grid>
<ContentControl Content="{Binding}"
ContentTemplateSelector="{StaticResource templateSelector}" />
</Grid>
</Window>
Как мне это связать? ContentControl
так что ViewModel окна будет передан в его DataTemplateSelector
?
Решение
это сработало для меня:
<ContentControl Content="{Binding DataContext, RelativeSource={RelativeSource Self}}"
ContentTemplateSelector="{StaticResource templateSelector}" />
Редактировать:
Однако я согласен с Аароном в том, что это, возможно, не лучший способ добиться цели.Вы сказали, что используете ViewModel.Самым простым способом, вероятно, было бы привязать ваш ItemsControl к новому свойству SelectedCollection в вашей модели представления, которое предоставляет нужную коллекцию.Затем в вашем флаге (при условии, что это свойство) вы можете активировать свойство, измененное для «SelectedCollection».
Другие советы
Здесь происходит много всего...
Вы сказали, что используете DataTemplateSelector
либо отобразить коллекцию A, либо коллекцию B, и в то же время вы заявили, что устанавливаете одну из коллекций в качестве DataContext
Окна.
Если вы хотите скрыть данные в одной коллекции, выполните фильтрацию самой коллекции.Другой подход — запустить привязку через IValueConverter
или IMultiValueConverter
.Еще одним решением может быть привязка двух элементов пользовательского интерфейса к каждой коллекции соответственно и изменение Visiblity
элемента пользовательского интерфейса на основе значения в вашей ViewModel.
Вариантов много... и если я правильно вас понял, DataTemplateSelector
не должен быть одним из них.