我有一个定义ControlTemplate的ListBox。所选项目具有更改背景和前景的样式,并且样式基本上起作用。但是,我想引入一种行为,在选择更改时显示模式消息框,询问用户是否确实要选择其他项目。我已经实现了一个ICommand,它在下面的代码中显示为AreYouSureCommand。
问题是在显示模态消息框时,所选项目的背景样式已更改,但前景不是。一旦我关闭模态消息框,前景颜色就会改变。我没有包含ICommand的代码,因为它有点令人费解,但希望在执行时用ShowDialog打开一个Window就足够了。
任何人都可以阐明为什么我的背景颜色会改变而不是我的前景颜色?
<ListBox x:Name="SubMenu" ItemsSource="{Binding MyItems}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=DisplayName}"
Foreground="{Binding Foreground, RelativeSource={RelativeSource AncestorType=ContentControl}}" />
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.Resources>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Border x:Name="MainBorder">
<ContentControl x:Name="Presenter">
<ContentPresenter />
</ContentControl>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<!-- Setter on MainBorder applies before AreYouSureCommand completes -->
<Setter TargetName="MainBorder" Property="Background" Value="Red" />
<!-- Setter on Presenter applies after AreYouSureCommand completes -->
<Setter TargetName="Presenter" Property="Foreground" Value="Green" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.Resources>
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding AreYouSureCommand}"
CommandParameter="{Binding SelectedItem, ElementName=SubMenu}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</ListBox>
答案 0 :(得分:0)
我最终为此找到了解决方案。基本上我使用IsSelected
属性的另一个setter将IsSelected
的{{1}}值推送到视图模型上。然后我使用ListViewItem
而不是常规触发器来设置所选样式,并将触发器绑定到视图模型上的DataTrigger
属性,而不是IsSelected
本身的属性。我真的不知道为什么会这样 - 它真的不应该有任何不同,但确实有效。
感谢Juan和Ben的评论。
ListViewItem