Элементы управления со свойством TemplateSelector - PullRequest
4 голосов
/ 02 декабря 2011

Теперь у меня есть ListView и в одном столбце есть:

<GridViewColumn CellTemplateSelector="{StaticResource messagerEditorTemplateSelector}"/>

И все хорошо: ячейка заполнена контентом, основанным на элементе. Но теперь я хочу разместить в этой ячейке 2 элемента управления: для одного шаблона необходимо выбрать привязку, а для другого - элемент управления с именем, скажем, TimeRangeView. Но я не могу понять, как это можно реализовать? Поэтому я должен иметь такой код:

<GridViewColumn>
    <DataTemplate>
        <StackPanel>
            <SomeControlWhichSupportTemplateSelector ... />
            <views:TimeRangeView ... />
        </StackPanel>
    </DataTemplate>
</GridViewColumn>`

Какой элемент управления я должен использовать для шаблона? Я нашел только список, но он должен быть привязан к коллекции. Конечно, я мог связать как:

<ListBox ItemsSource="{Binding Converter=ItemToCollectionConverter}" />

но это не выглядит элегантно. Может быть, есть другой способ сделать это?

1 Ответ

10 голосов
/ 02 декабря 2011

Вы можете использовать ContentControl и установить его свойство ContentTemplateSelector:

 <GridViewColumn>
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <StackPanel>
                <ContentControl ContentTemplateSelector="{StaticResource messagerEditorTemplateSelector}" />
                <views:TimeRangeView ... />
            </StackPanel>
        </DataTemplate>
      </GridViewColumn.CellTemplate>
    </GridViewColumn>

Обратите внимание, что для того, чтобы Binding работал в вашем ContentControl, вам необходимо установить для свойства Content значение, которое будет использоваться в привязках DataTemplate, возвращаемых вашим селектором.

Так что для варианта 1.
Вы также можете просто использовать DataTriggers:

     <GridViewColumn>
        <GridViewColumn.CellTemplate>
            <DataTemplate>
                <StackPanel>
                  <ContentControl Content="{Binding MyBoundObject}">
                    <ContentControl.Style>
                        <Style>
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding Path=MyBoundObject.ABooleanProperty}" Value="True">
                                    <Setter Property="ContentControl.ContentTemplate" Value="{StaticResource myFirstTemplate}" />
                                </DataTrigger>
                                <DataTrigger Binding="{Binding Path=MyBoundObject.ABooleanProperty}" Value="False">
                                    <Setter Property="ContentControl.ContentTemplate" Value="{StaticResource mySecondTemplate}" />
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </ContentControl.Style>
                </ContentControl>
                <views:TimeRangeView ... />
              </StackPanel>
            </DataTemplate>
          </GridViewColumn.CellTemplate>
        </GridViewColumn>

Что я и делаю, и это работает как шарм =)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...