TemplateSelector不起作用

时间:2016-11-21 17:46:55

标签: c# xaml uwp win-universal-app windows-10-universal

我有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没有启动时(我在构造函数上有断点)并且部分代码不起作用。我的问题是什么?

1 个答案:

答案 0 :(得分:1)

  1. 您已将ContentTemplate的{​​{1}}设置为选择器;您应该设置ContentControl属性。

  2. ContentTemplateSelector中,您将ItemsControl设置为看似模板选择器的内容;您应该设置ItemsTemplate属性。

  3. 您不应该绑定到模板选择器,而是以ItemsTemplateSelector s的身份访问它们。

  4. 我并不完全了解您尝试做的事情的细节,所以这里有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;以红色显示:

    ItemsControl

    我希望这足以让你走上正轨。