使用TemplateSelector属性控件

时间:2011-12-02 10:24:14

标签: wpf xaml controls

现在我有ListView并且在一列中有:

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

一切都很好:单元格充满了基于项目的内容。但是现在我想在这个单元格中放置2个控件:必须根据绑定选择一个模板,而使用名称控制其他模板,比如TimeRangeView。但我无法理解它是如何实现的?所以我必须有如下代码:

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

我应该使用哪种控制模板?我发现只有列表框但它必须绑定到集合。当然,我可以绑定:

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

但它看起来并不优雅。可能还有另一种方法吗?

1 个答案:

答案 0 :(得分:10)

您可以使用ContentControl并设置其ContentTemplateSelector属性:

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

请注意,要使Binding在ContentControl中工作,您必须将Content属性设置为选择器返回的DataTemplate的Bindings中使用的任何对象。

这是选项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>

我做的是什么,它的功能就像魅力=)