为ItemsControl中的特定项设置DataTemplate

时间:2023-01-19 09:13:04

I have an ItemsControl that contains a collection of items that are shown at a page. The ItemsControl has an ItemTemplate property which is set to certain DataTemplate resource.

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

Is it possible to change DataTemplate for a one specific item in my ItemsControl programmatically?

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

1 个解决方案

#1


2  

Sound like you are looking for ItemTemplateSelector

听起来像是在寻找ItemTemplateSelector

You can create a TemplateSelector and decide which template to apply based on a given item:

您可以创建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
    }
}

In xaml, add your template selector as a resource

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

And use it in your ItemsControl

并在ItemsControl中使用它

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

Hope this helps

希望这可以帮助

#1


2  

Sound like you are looking for ItemTemplateSelector

听起来像是在寻找ItemTemplateSelector

You can create a TemplateSelector and decide which template to apply based on a given item:

您可以创建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
    }
}

In xaml, add your template selector as a resource

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

And use it in your ItemsControl

并在ItemsControl中使用它

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

Hope this helps

希望这可以帮助