在EventTrigger命令完成之前,XAML样式将不会应用

时间:2015-04-29 15:19:44

标签: c# .net wpf xaml

我有一个定义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>

1 个答案:

答案 0 :(得分:0)

我最终为此找到了解决方案。基本上我使用IsSelected属性的另一个setter将IsSelected的{​​{1}}值推送到视图模型上。然后我使用ListViewItem而不是常规触发器来设置所选样式,并将触发器绑定到视图模型上的DataTrigger属性,而不是IsSelected本身的属性。我真的不知道为什么会这样 - 它真的不应该有任何不同,但确实有效。

感谢Juan和Ben的评论。

ListViewItem