我有一个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对象的一个属性与按钮上显示的文本进行比较。
答案 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>
当然,如果一次只能选择一个项目,则必须处理取消选择项目。