【问题标题】:Issue while mixing MultiBinding converter and Trigger in style混合 MultiBinding 转换器和 Trigger 时的问题
【发布时间】:2011-08-19 15:06:38
【问题描述】:

<UserControl.Resources> 中设置样式(假设转换器返回红色)

<Style x:Key="FieldToValidate" TargetType="{x:Type TextBox}">
    <Setter Property="Background">
        <Setter.Value>
            <MultiBinding Converter="{StaticResource VisualQueueOnErrorConverter}">
                <Binding RelativeSource="{RelativeSource self}" Path="Name" />
                <Binding RelativeSource="{RelativeSource AncestorType={x:Type DockPanel}}" Path="DataContext.ErrorFieldName" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay" />
            </MultiBinding>
        </Setter.Value>
    </Setter>

    <Style.Triggers>
        <Trigger Property="Background" Value="Red">
            <Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource self}}" />
            <Setter Property="Foreground" Value="White" />
        </Trigger>
    </Style.Triggers>
</Style>

和控制:

<TextBox  Name="FirstName" Text="{Binding FirstName}" Style="{StaticResource FieldToValidate}">  

预期结果是当 MultiBinding 转换器将背景颜色更改为红色时,字段 FirstName 获得焦点并且前景色更改为白色,但是当字段的背景更改为红色时,它没有获得焦点也不是新的前景色。

XAML 解析器似乎属性设置器的 MultiBinding 转换器之前处理触发器。

欢迎提出任何建议!

【问题讨论】:

    标签: .net xaml triggers multibinding


    【解决方案1】:

    我认为触发器中指定的Red 刷子和转换器返回的Red 刷子被认为不相等(因为它们是不同的实例),因此触发器永远不会执行。反正靠背景色来触发东西似乎不是什么好主意……

    你应该改变你的转换器,让它在发生错误时返回 true,并按如下方式使用它:

    <Style x:Key="FieldToValidate" TargetType="{x:Type TextBox}">
        <Style.Triggers>
            <DataTrigger Value="True">
                <DataTrigger.Binding>
                    <MultiBinding Converter="{StaticResource VisualQueueOnErrorConverter}">
                        <Binding RelativeSource="{RelativeSource self}" Path="Name" />
                        <Binding RelativeSource="{RelativeSource AncestorType={x:Type DockPanel}}" Path="DataContext.ErrorFieldName" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay" />
                    </MultiBinding>
                </DataTrigger.Binding>
                <Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource self}}" />
                <Setter Property="Background" Value="Red" />
                <Setter Property="Foreground" Value="White" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
    

    此外,在您的转换器名称中,您的意思可能是“视觉 cue”,而不是“queue”;)

    【讨论】:

    • 我一直在寻找一种优雅的方式来组合触发器和 MultiBinding,但没有找到任何东西,所以我求助于基于颜色的触发器......直到你出现!我刚刚测试了您的解决方案,效果很好!我还没有测试过用“cue”替换“Queue”,但我很确定它会起作用......;)谢谢。
    猜你喜欢
    • 2014-07-23
    • 1970-01-01
    • 2012-11-15
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多