现在我有ListView并且在一列中有:
<GridViewColumn CellTemplateSelector="{StaticResource messagerEditorTemplateSelector}"/>
一切都很好:单元格充满了基于项目的内容。但是现在我想在这个单元格中放置2个控件:必须根据绑定选择一个模板,而使用名称控制其他模板,比如TimeRangeView
。但我无法理解它是如何实现的?所以我必须有如下代码:
<GridViewColumn>
<DataTemplate>
<StackPanel>
<SomeControlWhichSupportTemplateSelector ... />
<views:TimeRangeView ... />
</StackPanel>
</DataTemplate>
</GridViewColumn>`
我应该使用哪种控制模板?我发现只有列表框但它必须绑定到集合。当然,我可以绑定:
<ListBox ItemsSource="{Binding Converter=ItemToCollectionConverter}" />
但它看起来并不优雅。可能还有另一种方法吗?
答案 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>
我做的是什么,它的功能就像魅力=)