2016-11-21 32 views
1

我有Items Control,但是我想改進這個代碼以處理不同類型的輸入數據。TemplateSelector不起作用

<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> 

我的轉換器返回簡單面板。但是,當我說它我的SimplePanel沒有啓動(我有構造函數的斷點)和部分代碼不起作用。我的問題是什麼?

回答

1
  1. 您正在將ContentControlContentTemplate設置爲您的選擇器;您應該設置ContentTemplateSelector屬性。

  2. 在您的ItemsControl中,您將ItemsTemplate設置爲看起來像模板選擇器的東西;您應該設置ItemsTemplateSelector屬性。

  3. 您不應綁定到模板選擇器,而是將它們作爲StaticResource s訪問。

我不完全理解你正在試圖做的細節,所以這裏是一個DataTemplateSelector,工程的一個例子。

首先,我用以下ItemsSource,以使該字符串「三公」顯示爲紅色的意圖:

public string[] ItemsSource => new[] 
    { 
     "One", "Two", "Three", 
    }; 

模板選擇具有將從XAML設置2個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); 
    } 
} 

數據模板選擇有SelectTemplateCore兩個版本。 This page討論了在什麼情況下要使用哪一個:

如果您ItemsControl.ItemsPanel是ItemsStackPanel或ItemsWrapGrid,提供了SelectTemplateCore(Object)方法的重寫。如果ItemsPanel是另一個面板,如VirtualizingStackPanel或WrapGrid,則爲SelectTemplateCore(Object,DependencyObject)方法提供覆蓋。

的XAML(其數據模板分配給選擇器的兩個屬性)看起來像這樣:

<Grid> 
    <Grid.Resources> 
     <local:ItemTemplateSelector x:Key="ItemTemplateSelector"> 
      <local:ItemTemplateSelector.NormalTemplate> 
       <DataTemplate> 
        <TextBlock Foreground="Blue" Text="{Binding}" /> 
       </DataTemplate> 
      </local:ItemTemplateSelector.NormalTemplate> 
      <local:ItemTemplateSelector.ThreeTemplate> 
       <DataTemplate> 
        <TextBlock Foreground="Red" Text="{Binding}" /> 
       </DataTemplate> 
      </local:ItemTemplateSelector.ThreeTemplate> 
     </local:ItemTemplateSelector> 
    </Grid.Resources> 
    <ItemsControl 
     VerticalAlignment="Center" 
     HorizontalAlignment="Center" 
     ItemsSource="{x:Bind ItemsSource, Mode=OneWay}" 
     ItemTemplateSelector="{StaticResource ItemTemplateSelector}"> 
    </ItemsControl> 
</Grid> 

結果看起來像這樣,以字符串「三」以紅色顯示:

ItemsControl

我希望這足以讓您走上正確的軌道。