ItemsControl WPF 的不同数据模板
Different DataTemplates for ItemsControl WPF
我在 XAML 中定义了一个 ItemsControl 为:
<ItemsControl ItemsSource="{Binding MyCollection}"
AlternationCount="{Binding RelativeSource={RelativeSource Self}, Path=Items.Count}">
<ItemsControl.Resources>
<DataTemplate x:Key="TemplateOne">
<Button Content="{Binding RelativeSource={RelativeSource Self}, Path=(ItemsControl.AlternationIndex)}" Style="{StaticResource StyleOne}"/>
</DataTemplate>
<DataTemplate x:Key="TemplateTwo">
<Button Content="{Binding RelativeSource={RelativeSource Self}, Path=(ItemsControl.AlternationIndex)}" Style="{StaticResource StyleTwo}"/>
</DataTemplate>
</ItemsControl.Resources>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Style.Triggers>
<Trigger Property="ItemsControl.AlternationIndex" Value="0">
<Setter Property="ContentTemplate" Value="{StaticResource TemplateOne}"></Setter>
</Trigger>
<Trigger Property="ItemsControl.AlternationIndex" Value="1">
<Setter Property="ContentTemplate" Value="{StaticResource TemplateTwo}"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
我的想法是我可以根据 ItemsControl 的当前交替索引设置不同的模板。虽然这有效并为我提供了不同的数据模板,但我还希望按钮的内容显示其交替索引,即 MyCollection 中项目的索引。我有什么地方可能出错的想法吗?
尝试
<Button Content="{Binding RelativeSource={RelativeSource AncestorType=ContentPresenter},
Path=(ItemsControl.AlternationIndex)}"
因为 ItemsControl.AlternationIndex
生活在 ItemContainer
(这是 ContentPresenter
)而不是 Button
(在你的例子中)。
您还没有为所有项目设置替代样式。你只有两个。我将 ItemsControl Count 设置为 2。
所以这是你的 ItemsControl(它包括@LPL 的解决方案)
<ItemsControl ItemsSource="{Binding MyCollection}"
AlternationCount="2">
<ItemsControl.Resources>
<DataTemplate x:Key="TemplateOne">
<Button Content="{Binding RelativeSource={RelativeSource AncestorType=ContentPresenter}, Path=(ItemsControl.AlternationIndex)}" Style="{StaticResource StyleOne}"/>
</DataTemplate>
<DataTemplate x:Key="TemplateTwo">
<Button Content="{Binding RelativeSource={RelativeSource AncestorType=ContentPresenter}, Path=(ItemsControl.AlternationIndex)}" Style="{StaticResource StyleTwo}"/>
</DataTemplate>
</ItemsControl.Resources>
我在 XAML 中定义了一个 ItemsControl 为:
<ItemsControl ItemsSource="{Binding MyCollection}"
AlternationCount="{Binding RelativeSource={RelativeSource Self}, Path=Items.Count}">
<ItemsControl.Resources>
<DataTemplate x:Key="TemplateOne">
<Button Content="{Binding RelativeSource={RelativeSource Self}, Path=(ItemsControl.AlternationIndex)}" Style="{StaticResource StyleOne}"/>
</DataTemplate>
<DataTemplate x:Key="TemplateTwo">
<Button Content="{Binding RelativeSource={RelativeSource Self}, Path=(ItemsControl.AlternationIndex)}" Style="{StaticResource StyleTwo}"/>
</DataTemplate>
</ItemsControl.Resources>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Style.Triggers>
<Trigger Property="ItemsControl.AlternationIndex" Value="0">
<Setter Property="ContentTemplate" Value="{StaticResource TemplateOne}"></Setter>
</Trigger>
<Trigger Property="ItemsControl.AlternationIndex" Value="1">
<Setter Property="ContentTemplate" Value="{StaticResource TemplateTwo}"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
我的想法是我可以根据 ItemsControl 的当前交替索引设置不同的模板。虽然这有效并为我提供了不同的数据模板,但我还希望按钮的内容显示其交替索引,即 MyCollection 中项目的索引。我有什么地方可能出错的想法吗?
尝试
<Button Content="{Binding RelativeSource={RelativeSource AncestorType=ContentPresenter},
Path=(ItemsControl.AlternationIndex)}"
因为 ItemsControl.AlternationIndex
生活在 ItemContainer
(这是 ContentPresenter
)而不是 Button
(在你的例子中)。
您还没有为所有项目设置替代样式。你只有两个。我将 ItemsControl Count 设置为 2。 所以这是你的 ItemsControl(它包括@LPL 的解决方案)
<ItemsControl ItemsSource="{Binding MyCollection}"
AlternationCount="2">
<ItemsControl.Resources>
<DataTemplate x:Key="TemplateOne">
<Button Content="{Binding RelativeSource={RelativeSource AncestorType=ContentPresenter}, Path=(ItemsControl.AlternationIndex)}" Style="{StaticResource StyleOne}"/>
</DataTemplate>
<DataTemplate x:Key="TemplateTwo">
<Button Content="{Binding RelativeSource={RelativeSource AncestorType=ContentPresenter}, Path=(ItemsControl.AlternationIndex)}" Style="{StaticResource StyleTwo}"/>
</DataTemplate>
</ItemsControl.Resources>