如何使用触发器突出显示XAML中的按钮?

时间:2013-11-14 15:49:27

标签: c# wpf xaml

我有一个ItemsControl控件,显示一些按钮。 当我点击其中一个按钮时,我必须显示所选资源的一些细节(绑定到按钮)。

因此,当单击该按钮时,我在ViewModel上设置了一个名为SelectedResource的属性。

这工作正常,我想做的是突出显示点击的按钮。

我的按钮有一个ControlTemplate,如下所示:

<ControlTemplate x:Key="ResourceButtonTemplate" TargetType="{x:Type ButtonBase}">
    <Border Name="SelectedButtonBorder"
            CornerRadius="3">
        <Border x:Name="border" 
            BorderBrush="{TemplateBinding BorderBrush}" 
            BorderThickness="{TemplateBinding BorderThickness}" 
            CornerRadius="3"
            Background="{TemplateBinding Background}" 
            SnapsToDevicePixels="True">
            <StackPanel Orientation="Horizontal" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}">
                <Image Source="{Binding Type.Value, Converter={converter:ResourceTypeToStringConverter}}"></Image>
                <ContentPresenter x:Name="contentPresenter" 
                              ContentTemplate="{TemplateBinding ContentTemplate}" 
                              Content="{TemplateBinding Content}" 
                              ContentStringFormat="{TemplateBinding ContentStringFormat}" 
                              Focusable="False"  
                              Margin="{TemplateBinding Padding}" 
                              RecognizesAccessKey="True" 
                              SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
                              VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
            </StackPanel>
        </Border>
    </Border>
    <ControlTemplate.Triggers>
        <DataTrigger Binding="{Binding SelectedResource}" Value="">
            <Setter TargetName="SelectedButtonBorder" Property="BorderBrush" Value="Red" />
            <Setter TargetName="SelectedButtonBorder" Property="BorderThickness" Value="2" />
        </DataTrigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

我已经尝试过DataTrigger,但我无法绑定datatrigger的value属性。

那么,有没有办法只使用XAML?

修改

我不想将SelectedResource与空字符串进行比较,实际上我不知道要比较什么。我试图将SelectedResource对象的一个​​属性与按钮上显示的文本进行比较。

3 个答案:

答案 0 :(得分:0)

假设您已将视图的DataContext正确设置为视图模型的实例,您应该能够使用SelectedResource这样的RelativeSource Binding属性访问:< / p>

<DataTrigger Binding="{Binding DataContext.SelectedResource, 
    RelativeSource={RelativeSource AncestorType={x:Type 
    YourViewsNamespacePrefix:YourUserControl}}}" Value="">
    <Setter TargetName="SelectedButtonBorder" Property="BorderBrush" Value="Red" />
    <Setter TargetName="SelectedButtonBorder" Property="BorderThickness" Value="2" />
</DataTrigger>

使用此Binding,框架将查找类型为Button的{​​{1}}的父级,当它找到时,它将查看对象集为YourUserControl 1}}然后最后,在该对象中查找名为DataContext的属性。


更新&gt;&gt;&gt;

只要您使用值,使用什么值并不重要。你说当点击按钮时我在ViewModel上设置了一个名为SelectedResource 的属性。假设您将SelectedResource值存储在Button.Name ...然后 是您放在SelectedResource中的值。当然,您需要为每个DataTrigger创建略有不同的DataTrigger

Button

您遇到的问题是您无法使用<DataTrigger Binding="{Binding DataContext.SelectedResource, RelativeSource={RelativeSource AncestorType={x:Type YourViewsNamespacePrefix:YourUserControl}}}" Value="Button1"> ... </DataTrigger> ... <DataTrigger Binding="{Binding DataContext.SelectedResource, RelativeSource={RelativeSource AncestorType={x:Type YourViewsNamespacePrefix:YourUserControl}}}" Value="Button8"> ... </DataTrigger> 来显示ItemsControl元素。

答案 1 :(得分:0)

或者你尝试过这样的事情:

<Button>
            <Button.Style>
                <Style TargetType="{x:Type Button}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding SelectedResource}" Value="1">
                            <Setter Property="Background"  Value="Red" />
                        </DataTrigger>
                        <DataTrigger Binding="{Binding SelectedResource}" Value="2">
                            <Setter Property="Background"  Value="White" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Button.Style>
        </Button>

答案 2 :(得分:0)

假设每个Button的DataContext都是给定的Resource,那么datatrigger中的绑定就会失败。

我在IsSelected课程中会有一个bool属性Resource。然后您的触发器将如下所示:

<DataTrigger Binding="{Binding IsSelected}" Value="True">
    <Setter TargetName="SelectedButtonBorder" Property="BorderBrush" Value="Red" />
    <Setter TargetName="SelectedButtonBorder" Property="BorderThickness" Value="2" />
</DataTrigger>

当然,如果一次只能选择一个项目,则必须处理取消选择项目。