我有一个在边框上设置样式的场景。它上面有一个多数据触发器,一些条件检查边框子元素的属性。它看起来像这样:
<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元素,我能够正常工作。显然这比我想要的效率低,但我不知道会导致这个问题的原因。