1

我有一个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?

4

1 回答 1

3

听起来您正在寻找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}">

希望这可以帮助

于 2013-09-25T07:06:23.000 回答