Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有多数据触发器的WPF多绑定转换器_C#_Wpf - Fatal编程技术网

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

C# 具有多数据触发器的WPF多绑定转换器,c#,wpf,C#,Wpf,我有一个在边框上设置样式的场景。它有一个multidata触发器,一些条件检查边界子元素的属性。看起来是这样的: <Style.Triggers> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding="{Binding Mode=OneWay, Path=IsMouseOver, RelativeSource={Relati

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

<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>

我需要添加一些“或”逻辑,这样如果Child.IsFocused为真,背景也会改变。作为测试,我将当前的Child.IsEnabled条件替换为Child.IsFocused,当控件接收到焦点时,背景会按预期发生变化。我做了一些研究,找到了一种实现所需的“或”逻辑的方法,但是当我这样做时,Child.IsFocused属性将解析为dependancProperty.unset值。这是修改后的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;
}
公共对象转换(对象[]值,类型targetType,对象参数,CultureInfo区域性) { 尝试 { if(值!=null) { for(int i=0;i 我不明白为什么这会失败。语法显然略有不同,但看起来它完成了相同的任务。非常感谢您的帮助

更新:
在处理了几个小时之后,我把问题缩小了一点。在我发布的初始代码块中,如果是第一个条件,Child.IsEnabled将无法解析。这同样适用于Child.IsFocused。如果只有两个条件并且它们被放在第二位,则任何一个都可以解决问题。通过创建三种不同的样式并按名称引用目标子元素,我可以使它正常工作。显然,这比我希望的效率要低,但我不知道是什么导致了这个问题。

看,这很接近,但我认为这不起作用。看起来我的相对源设置正确。我用更多的信息编辑了开场白,这可以更好地解释我为什么需要这个孩子。同样,在转换器之外,这一切都可以正常工作。您应该发布这篇文章,以可靠地演示这个问题。除此之外,您是否可以通过“Child.IsFocused属性正在解析为DependencyProperty.UnsetValue”来确认,您的意思是您已经调试了
Convert()
方法,并且这就是您收到的属性的值?还请描述您所做的其他调试(即确认通过绑定系统的值流),以及发布您对
Child.IsFocused
所做的非多重绑定测试的XAML。您要求的大部分信息都在我的帖子中。非多绑定版本是第一个使用Child.IsEnabled和Child.IsFocused切换的代码块,这就是我所说的。这是一个足够简单的更改,可以可视化,而不用我用多余的代码把帖子弄得乱七八糟。至于“未设置”解决方案,是的,我可以通过转换器值进行确认。我很感激你花时间阅读我的帖子并写些东西,但你并没有提供任何帮助或指导。