为ItemsControl中的特定项设置DataTemplate

时间:2013-09-25 07:00:47

标签: c# wpf windows-phone datatemplate

我有一个ItemsControl,其中包含一个页面显示的项目集合。 ItemsControl具有ItemTemplate属性,该属性设置为某个DataTemplate资源。

<DataTemplate x:Key="SimpleTemplate">
        <!-- .... -->
</DataTemplate>

<DataTemplate x:Key="ComplexTemplate">
        <!-- .... -->
</DataTemplate>
...............................
<ItemsControl 
      x:Name="MainCanvas"
      DataContext="{StaticResource mainItems}"
      ItemsSource="{Binding Path=Buttons}"
      ItemTemplate="{StaticResource SimpleTemplate}"
>

      <ItemsControl.ItemsPanel>
           <ItemsPanelTemplate>
                 <Canvas Width="4000" Height="4000" />
           </ItemsPanelTemplate>                       
      </ItemsControl.ItemsPanel>

</ItemsControl> 

是否可以通过编程方式为ItemsControl中的一个特定项目更改DataTemplate?

1 个答案:

答案 0 :(得分:2)

听起来像是在寻找ItemTemplateSelector

您可以创建TemplateSelector并根据给定项目决定应用哪个模板:

public class MyTemplateSelector : DataTemplateSelector
{
    public DataTemplate SimpleTemplate { get; set; }

    public DataTemplate ComplexTemplate { get; set; }

    public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container)
    {
        // Logic to decide which template to apply goes here

        return // Either SimpleTemplate or ComplexTemplate
    }
}

在xaml中,将模板选择器添加为资源

<local:MyTemplateSelector x:Key="itemTemplateSelector">
            <local:MyTemplateSelector.SimpleTemplate>
                <DataTemplate>

                    <!-- Implementation goes here -->

                </DataTemplate>
            </local:MyTemplateSelector.SimpleTemplate>
            <local:MyTemplateSelector.ComplexTemplate>
                <DataTemplate>

                    <!-- Implementation goes here -->

                </DataTemplate>
            </local:MyTemplateSelector.ComplexTemplate>
</local:MyTemplateSelector>

并在ItemsControl

中使用它
<ItemsControl 
  x:Name="MainCanvas"
  DataContext="{StaticResource mainItems}"
  ItemsSource="{Binding Path=Buttons}"
  ItemTemplateSelector="{StaticResource itemTemplateSelector}">

希望这有帮助