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

Я пытаюсь привязать окно 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?

Ответы [ 2 ]

4 голосов
/ 23 февраля 2011

это сработало для меня:

<ContentControl Content="{Binding DataContext, RelativeSource={RelativeSource Self}}"              
                    ContentTemplateSelector="{StaticResource templateSelector}" />

Edit:

Я согласен с Аароном, однако, что это может быть не лучшим способом для достижения цели. Вы сказали, что используете ViewModel. Возможно, самым простым способом было бы связать ваш ItemsControl с новым свойством «SelectedCollection» в вашей Viewmodel, которое предоставляет нужную коллекцию. Затем в вашем флаге (при условии, что это свойство) вы можете запустить свойство, измененное для «SelectedCollection».

2 голосов
/ 23 февраля 2011

Здесь происходит много всего ...

Вы сказали, что используете DataTemplateSelector для отображения коллекции A или коллекции B, в то же время заявив, что устанавливаете одну из коллекций как DataContext окна.

Если вы хотите скрыть данные в одной коллекции, выполните фильтрацию самой коллекции. Другой подход заключается в запуске привязки через IValueConverter или IMultiValueConverter. Еще одно решение может состоять в том, чтобы два элемента пользовательского интерфейса были привязаны к каждой коллекции соответственно и изменить Visiblity элемента пользовательского интерфейса на основе значения в вашей ViewModel.

Много разных вариантов ... и если я вас правильно понимаю, DataTemplateSelector не должен быть одним из них.

...