使用MultiDataTrigger.条件从设置类

本文关键字:设置 条件 MultiDataTrigger 使用 | 更新日期: 2023-09-27 18:15:02

如果两个值都符合预期,我的MultiDataTrigger应该改变TabItem的属性。其中一个值是来自TabItemProperty,另一个是Properties.Settings.Default属性。

<!--<App xmlns:prop="clr-namespace:MyApp.Properties"... -->
<DropShadowEffect x:Key="Glow.Foreground.Large" ShadowDepth="0" Color="WhiteSmoke" 
                  Opacity="1" BlurRadius="10" RenderingBias="Quality"/>
<Style TargetType="{x:Type TabItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TabItem}">
                <Grid Name="Panel" Background="Transparent">
                    <Border Name="ContentBorder" 
                            BorderBrush="#FFD4D4D4" BorderThickness="0">
                        <ContentPresenter x:Name="ContentSite"
                            VerticalAlignment="Center" Effect="{x:Null}"
                            HorizontalAlignment="Center"
                            ContentSource="Header"
                            Margin="10,2"/>
                            </Border>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter TargetName="Panel" 
                                    Property="Background" 
                                    Value="#FFFAFAFA" />
                            <Setter Property="Foreground"
                                    Value="#FF2B579A" />
                            <Setter TargetName="ContentBorder"
                                    Property="BorderThickness" 
                                    Value="1,1,1,0" />
                            </Trigger>
                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition Property="IsSelected" Value="False"/>
                                <Condition Binding="{Binding 
                                           Source={x:Static prop:Settings.Default}, 
                                           Path=EditorExtendChrome}" Value="True"/>
                            </MultiDataTrigger.Conditions>
                            <Setter TargetName="ContentBorder"
                                    Property="Effect" 
                                    Value="{StaticResource Glow.Foreground.Large}" />
                            <Setter TargetName="ContentBorder"
                                    Property="Background" 
                                    Value="#7FFFFFFF"/>
                        </MultiDataTrigger>
                        <Trigger Property="IsMouseOver" Value="True"
                                 SourceName="Panel">
                            <Setter Property="Foreground"
                                    Value="#FF2B579A" />
                            <Setter Property="Background"
                                    Value="#FFFAFAFA" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <!--Default Values-->
        <Setter Property="FontFamily" Value="Segoe UI Semilight"/>
    </Style>

我一直在关注这篇文章,但是错误"你必须为'Binding'设置一个非空值"仍然存在。

使用MultiDataTrigger.条件从设置类

正常的Settings类不提供wpf兼容的属性更改通知。可能是,这就是为什么你的代码不能工作。但是,如果没有一个好的、最小的完整的代码示例来可靠地再现问题,就无法确定。

Default属性在程序执行的早期将是null,因此如果没有属性更改通知,WPF将只会看到null值,这当然对它没有用处。

还请注意,根据您引用的SO答案,MultiDataTriggerCondition对象应指定Binding而不是Property

如果上面没有解决你的问题,请提供一个更好的代码示例,并更具体地说明错误:你什么时候看到这个错误,它是如何报告的,什么是错误的完整堆栈跟踪(如果可用)?请注意,如果有一个好的代码示例,那么即使没有直接支持属性更改通知,也可能提供解决您的确切场景的答案。