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

StackOverflow https://stackoverflow.com/questions/5036835

  •  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 не должен быть одним из них.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top