我有Items Control
,但我希望改进此代码以处理不同类型的输入数据。
<Grid>
<ItemsControl x:Name="control"
VerticalAlignment="Center"
HorizontalAlignment="Center"
ItemsSource="{x:Bind ItemsSource, Mode=OneWay}"
ItemTemplate="{x:Bind CellTemplate, Mode=OneWay, Converter={StaticResource SimpleSelector}}">
<!--I want make like this-->
<ContentControl VerticalAlignment="Stretch"
HorizontalAlignment="Stretch"
ContentTemplate="{Binding SelectedCollageTemplate, Converter={StaticResource CollageTemplateSelector}}" />
<!-- -->
<!--now I have this-->
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<controls:SimplePanel SelectedCollage="{Binding SelectedCollage, Mode=TwoWay}"
SelectedCollagePattern="{Binding SelectedCollagePattern}">
<controls:SimplePanel.Background>
<ImageBrush Stretch="Fill"
ImageSource="ms-appx:///Images/Background/5.jpg" />
</controls:SimplePanel.Background>
</controls:SimplePanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<!-- -->
</ItemsControl>
</Grid>
正如您所见,我希望更改硬编码以更灵活的方式并使用Template selector
我创建选择器:
<templateSelector:CollageTemplateSelector x:Key="CollageTemplateSelector"
SimpleTemplate="{StaticResource SimpleTemplate}"
ShapeTemplate="{StaticResource ShapeTemplate}"/>
并添加了DataTemplate
:
<DataTemplate x:Key="SimpleTemplate">
<controls:SimplePanel
SelectedCollage="{Binding SelectedCollage, Mode=TwoWay}"
SelectedCollagePattern="{Binding SelectedCollagePattern}">
<controls:SimplePanel.Background>
<ImageBrush Stretch="Fill"
ImageSource="ms-appx:///Images/Background/5.jpg" />
</controls:SimplePanel.Background>
</controls:SimplePanel>
我的转换器返回Simple Panel。但是当我发现它SimplePanel
没有启动时(我在构造函数上有断点)并且部分代码不起作用。我的问题是什么?
答案 0 :(得分:1)
您已将ContentTemplate
的{{1}}设置为选择器;您应该设置ContentControl
属性。
在ContentTemplateSelector
中,您将ItemsControl
设置为看似模板选择器的内容;您应该设置ItemsTemplate
属性。
您不应该绑定到模板选择器,而是以ItemsTemplateSelector
s的身份访问它们。
我并不完全了解您尝试做的事情的细节,所以这里有StaticResource
的例子。
首先,我使用以下DataTemplateSelector
,目的是制作字符串&#34; Three&#34;用红色显示:
ItemsSource
模板选择器有两个public string[] ItemsSource => new[]
{
"One", "Two", "Three",
};
属性,将从XAML设置 - 一个用于&#34;三个&#34;串;所有其他字符串的另一个:
DataTemplate
数据模板选择器有两个版本的public sealed class ItemTemplateSelector : DataTemplateSelector
{
/// <summary>
/// This property is set in XAML.
/// </summary>
public DataTemplate NormalTemplate { get; set; }
/// <summary>
/// This property is set in XAML.
/// </summary>
public DataTemplate ThreeTemplate { get; set; }
protected override DataTemplate SelectTemplateCore(object item)
{
if ("Three".Equals(item))
{
return ThreeTemplate;
}
return NormalTemplate;
}
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
{
return SelectTemplateCore(item);
}
}
。 This page讨论在什么情况下使用哪一个:
如果ItemsControl.ItemsPanel是ItemsStackPanel或ItemsWrapGrid,请为SelectTemplateCore(Object)方法提供覆盖。如果ItemsPanel是不同的面板,例如VirtualizingStackPanel或WrapGrid,则为SelectTemplateCore(Object,DependencyObject)方法提供覆盖。
XAML(将数据模板分配给选择器的两个属性)如下所示:
SelectTemplateCore
结果如下所示,字符串&#34; Three&#34;以红色显示:
我希望这足以让你走上正轨。