ItemControl自定义样式的第一项

时间:2018-09-18 23:12:36

标签: c# wpf xaml

我有一个带有4个按钮的“ ItemsControl”,并且在应用页边距时,第一个按钮看起来并不像我想要的那样。是否可以修改第一个按钮的边距?或者,是否可以访问每个按钮并对其应用不同的属性?谢谢

            <ItemsControl ItemsSource="{Binding PercentageList}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <UniformGrid Columns="{Binding PercentageList.Count}" />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Button Margin="5,0,0,0"
                                Content="{Binding Name}"
                                CommandParameter="{Binding}"
                                Style="{StaticResource ButtonStyle}"
                                Command="{Binding DataContext.SelectedPercentageCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" />
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>

enter image description here

最终解决方案

<ItemsControl ItemsSource="{Binding PercentageList}"
              AlternationCount="{Binding PercentageList.Count}">
    <ItemsControl.ItemContainerStyle>
        <Style>
            <Setter Property="FrameworkElement.Margin"
                    Value="5,5,0,5" />
        </Style>
    </ItemsControl.ItemContainerStyle>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="{Binding PercentageList.Count}" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Content="{Binding Name}"
                    CommandParameter="{Binding}"
                    Style="{StaticResource ButtonStyle}"
                    Command="{Binding DataContext.SelectedPercentageCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" />
            <DataTemplate.Triggers>
                <Trigger Property="ItemsControl.AlternationIndex"
                         Value="0">
                    <Setter Property="Margin"
                            Value="0,5" />
                </Trigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

2 个答案:

答案 0 :(得分:1)

您可以使用Trigger来解决此问题。

<DataTemplate.Triggers>
    <DataTrigger Binding="{Binding RelativeSource={RelativeSource PreviousData}}" Value="{x:Null}">
        <Setter TargetName="myTargetElement" Property="SomeProperty" Value="SomeValue"/>
    </DataTrigger>
</DataTemplate.Triggers>

通过这种方法,您可以在DataTemplate中为第一项自定义属性。

如果您想对每个按钮应用独特的样式,听起来您可能需要在按钮项的视图模型中捕获更多信息。

如果您只是想使所有物体之间的间距均匀,我通常会在物品周围的所有方向上使用半边距,并在ItemsControl周围使用补码,这样可以消除这些特殊的雪花情况。

答案 1 :(得分:0)

您可以有一个更简单的方法,只需像这样更改边距的应用方式即可:

<Button Margin="2,0,0,2"
        Content="{Binding Name}"
        CommandParameter="{Binding}"
        Style="{StaticResource ButtonStyle}"
        Command="{Binding DataContext.SelectedPercentageCommand, 
                  RelativeSource={RelativeSource FindAncestor, 
                                  AncestorType={x:Type UserControl}}}" />