C# 具有多数据触发器的WPF多绑定转换器
我有一个在边框上设置样式的场景。它有一个multidata触发器,一些条件检查边界子元素的属性。看起来是这样的:C# 具有多数据触发器的WPF多绑定转换器,c#,wpf,C#,Wpf,我有一个在边框上设置样式的场景。它有一个multidata触发器,一些条件检查边界子元素的属性。看起来是这样的: <Style.Triggers> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding="{Binding Mode=OneWay, Path=IsMouseOver, RelativeSource={Relati
<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切换的代码块,这就是我所说的。这是一个足够简单的更改,可以可视化,而不用我用多余的代码把帖子弄得乱七八糟。至于“未设置”解决方案,是的,我可以通过转换器值进行确认。我很感激你花时间阅读我的帖子并写些东西,但你并没有提供任何帮助或指导。