wpf - 在数据模板中使用样式

标签 wpf styles datatemplate

我有一个名为 item 的类,它只包含两个属性。我会将它们显示在屏幕上作为带有样式的按钮。这个问题涉及当我想要影响的元素位于样式而不是数据模板中时,如何根据 IsSelected 值设置按钮的样式。我已经尝试过使用触发器,但无法让它工作。

该类如下。

public class Item : ObservableObject
{
    private string _title;
    private bool _isSelected;

    public string Title
    {
        get { return _title; }
        set
        {
            _title = value;
            RaisePropertyChanged("Title");
        }
    }

    public bool IsSelected
    {
        get { return _isSelected; }
        set
        {
            _isSelected = value;
            RaisePropertyChanged("IsSelected");
        }
    }
}

我使用数据模板在 ItemsControls 中显示这些项目。

<ItemsControl ItemsSource="{Binding Path=Items}" ItemTemplate="{StaticResource ResourceKey=ItemTemplate}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>

使用以下样式和数据模板。

<Style x:Key="ItemButton" TargetType="Button">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border Name="ButtonBorder" BorderThickness="2,2,2,0" BorderBrush="#AAAAAA"  CornerRadius="6,6,0,0"  Margin="2,20,0,0" Background="Black">
                    <ContentPresenter
                            VerticalAlignment="Center"  
                            HorizontalAlignment="Center"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
<DataTemplate x:Key="ItemTemplate">
    <Button Height="60" Style="{StaticResource ItemButton}" Name="Button">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding Path=Title}" 
                       HorizontalAlignment="Left" Margin="5,5,5,3" FontSize="25" Foreground="#6B6B6B" FontFamily="Arial" />
                <Button Style="{StaticResource NoChromeButton}" Margin="0,0,5,0">
                <Button.Content>
                    <Image Height="20" Source="/WpfApplication1;component/Image/dialogCloseButton.png"></Image>
                </Button.Content>
                <Button.ToolTip>
                    Close    
                </Button.ToolTip>
            </Button>
        </StackPanel>
    </Button>
</DataTemplate>

当 IsSelected 为 True 时,我需要将对象 Item 上的“ButtonBorder”背景从黑色更改为白色。

我已在数据模板中添加了触发器 这不起作用,我猜是因为样式覆盖了 DataTemplate,因此背景保持白色。然而,当我尝试在样式中执行触发器时,我无法访问属性 IsSelected?

数据模板触发器

    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding IsSelected}" Value="True">
            <Setter TargetName="Button" Property="Background" Value="White"/>
        </DataTrigger>
    </DataTemplate.Triggers>

样式触发器

    <Style.Triggers>
        <DataTrigger Binding="{Binding IsSelected}" Value="True">
            <Setter Property="Background" Value="White"/>
        </DataTrigger>
    </Style.Triggers>

我错过了什么吗?

最佳答案

将您的 ButtonBorder.Background 设为 {TemplateBinding Background},这意味着它将使用分配给模板化按钮的任何背景颜色,然后您可以更改按钮的背景基于触发器

<Style x:Key="ItemButton" TargetType="Button">
    <Setter Property="Background" Value="Black" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border Name="ButtonBorder" Background="{TemplateBinding Background}" ... >
                    <ContentPresenter ... "/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style x:Key="SelectableItemButton" TargetType="Button" BasedOn="{StaticResource ItemButton}">
    <Setter Property="Background" Value="Black" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsSelected}" Value="True">
            <Setter Property="Background" Value="White"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

<DataTemplate x:Key="ItemTemplate">
    <Button Height="60" Style="{StaticResource SelectableItemButton}">
        ...
    </Button>
</DataTemplate>

我还制作了一个继承自ItemButtonSelectableItemButton样式,并且只实现了触发器

关于wpf - 在数据模板中使用样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8169005/

相关文章:

silverlight - 如何以编程方式修改数据模板?

c# - 使用比例网格大小时(*)如何自动限制行/列的最小尺寸?

c# - 让 XAML 设计器在 VS2010 中显示设计

html - 如何设置 HTML 选择/选项标签的样式?

c# - iPhone 喜欢 WPF 项目中的红色徽章通知?

wpf - 如何在 WPF 中编写数据模板/链接到子数据模板?

wpf - 用户控件中同一 ViewModel 的两个 View

c# - 在 WPF 中轻松地将通知传播到 UI

c# - 当我尝试从 WPF 中的 RichTextBox 手动删除图像时出现 InvalidOperationException

html - 仅将 div 的某些部分设为可滚动