具有多数据触发器的WPF多重绑定转换器

时间:2015-01-23 19:40:27

标签: c# wpf

我有一个在边框上设置样式的场景。它上面有一个多数据触发器,一些条件检查边框子元素的属性。它看起来像这样:

<Style.Triggers>
    <MultiDataTrigger>
        <MultiDataTrigger.Conditions>
            <Condition Binding="{Binding Mode=OneWay, Path=IsMouseOver, RelativeSource={RelativeSource Self}}" Value="True" />
            <Condition Binding="{Binding Mode=OneWay, Path=Child.IsEnabled, RelativeSource={RelativeSource Self}}" Value="True" />
        </MultiDataTrigger.Conditions>
        <Setter Property="Background" Value="{Binding Path=CommandBackgroundHover, RelativeSource={RelativeSource AncestorType={x:Type ctrl:ExtendedProgressBar}}}"/>
    </MultiDataTrigger>
</Style.Triggers>

我需要添加一些&#34;或&#34;如此逻辑,所以如果Child.IsFocused为真,背景也会改变。作为测试,我用Child.IsFocused替换了当前的Child.IsEnabled条件,当控件获得焦点时,背景按预期更改。我做了一些研究,找到了实现&#34;或&#34;的方法。我需要的逻辑,但是当我这样做时,Child.IsFocused属性正在解析为DependancyProperty.UnsetValue。这是修改后的xaml和转换器。

<Style.Triggers>
    <MultiDataTrigger>
        <MultiDataTrigger.Conditions>
            <Condition Value="True">
                <Condition.Binding>
                    <MultiBinding Converter="{StaticResource MultiBoolConverter}">
                        <Binding Path="Child.IsFocused" RelativeSource="{RelativeSource Self}"/>
                        <Binding Path="IsMouseOver" RelativeSource="{RelativeSource Self}"/>
                    </MultiBinding>
                </Condition.Binding>
            </Condition>
            <Condition Binding="{Binding Mode=OneWay, Path=Child.IsEnabled, RelativeSource={RelativeSource Self}}" Value="True" />
        </MultiDataTrigger.Conditions>
        <Setter Property="Background" Value="{Binding Path=CommandBackgroundHover, RelativeSource={RelativeSource AncestorType={x:Type ctrl:ExtendedProgressBar}}}"/>
    </MultiDataTrigger>
</Style.Triggers>

这是转换器:

public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture)
{
    try
    {
        if (value != null)
        {
            for (int i = 0; i < value.Length; i++)
            {
                if (value[i] is bool && (bool)value[i]) { return true; }
            }
        }
    }
    catch { }

    return false;
}

我不知道为什么会失败。语法明显略有不同,但看起来它正在完成同样的事情。非常感谢任何帮助!

更新: 在把这个问题搞砸了几个小时之后,我把这个问题缩小了一点。在我发布的初始代码块中,如果它是第一个条件,Child.IsEnabled将无法解析。 Child.IsFocused也是如此。如果只有两个条件并且它们被放置在第二个条件下,则要么解决罚款。通过创建三个单独的样式并按名称引用目标Child元素,我能够正常工作。显然这比我想要的效率低,但我不知道会导致这个问题的原因。

0 个答案:

没有答案