WPF)为什么完全相同的绑定在一个地方有效,而在另一个地方无效



所以我完全不明白为什么完全相同的绑定适用于一个元素而不适用于另一个元素(在同一控件上,绑定代码是复制粘贴的(。

我制作了一个MultiValueConverter,它可以接受4个值。values[0]确定应返回值[1-3]中的哪一个。(三元逻辑(

这个转换器工作得很好。我使用它来选择控件应该基于枚举的颜色和图像。但是,当使用相同的工具提示转换器在字符串之间进行选择时,我会出现绑定错误。

奇怪的是,当我在模板中使用相同的转换器来选择ToolTip的字符串时,它就工作了!完全相同的代码复制粘贴。

当我与工具提示绑定(不在模板中(时,值[0]是"0";{DependencyProperty.UnsetValue}";,而不是我绑定到的枚举。

UserControl内的代码(

<v:ColoredImage Width="20" Height="20" HorizontalAlignment="Right">
<v:ColoredImage.Color> //THIS WORKS
<MultiBinding Converter="{StaticResource TernaryConverter}">
<Binding Path="ParamStatus" ElementName="pn"/> <-- SAME BINDING
<Binding Source="{StaticResource GreenLight}"/>
<Binding Source="{StaticResource YellowLight}"/>
<Binding Source="{StaticResource RedLight}"/>
</MultiBinding>
</v:ColoredImage.Color>
<v:ColoredImage.Image> // THIS WORKS
<MultiBinding Converter="{StaticResource TernaryConverter}">
<Binding Path="ParamStatus" ElementName="pn"/> <-- SAME BINDING
<Binding Source="{StaticResource OkIcon}"/>
<Binding Source="{StaticResource WarningIcon}"/>
<Binding Source="{StaticResource ErrorIcon}"/>
</MultiBinding>
</v:ColoredImage.Image>
<v:ColoredImage.ToolTip>
<ToolTip> //THIS PART DOES NOT WORK
<MultiBinding Converter="{StaticResource TernaryConverter}"> 
<Binding Path="ParamStatus" ElementName="pn"/> <-- SAME BINDING
<Binding Source="OK"/>
<Binding Source="Not Synced"/>
<Binding Source="ERROR"/>
</MultiBinding>
</ToolTip>
</v:ColoredImage.ToolTip>
</v:ColoredImage>

样式和控制模板内部的代码(此代码有效,尽管它是相同的(

<v:ColoredImage  Height="24" Width="24" Margin="65,65,0,0" VerticalAlignment="Center">
<v:ColoredImage.Color>
<MultiBinding Converter="{StaticResource TernaryConverter}">
<Binding Path="Status" RelativeSource="{RelativeSource TemplatedParent}"/>
<Binding Source="{StaticResource GreenLight}"/>
<Binding Source="{StaticResource YellowLight}"/>
<Binding Source="{StaticResource RedLight}"/>
</MultiBinding>
</v:ColoredImage.Color>
<v:ColoredImage.Image>
<MultiBinding Converter="{StaticResource TernaryConverter}">
<Binding Path="Status" RelativeSource="{RelativeSource TemplatedParent}"/>
<Binding Source="{StaticResource OkIcon}"/>
<Binding Source="{StaticResource UnidentifiedIcon}"/>
<Binding Source="{StaticResource ErrorIcon}"/>
</MultiBinding>
</v:ColoredImage.Image>
<v:ColoredImage.ToolTip>
<ToolTip>
<MultiBinding Converter="{StaticResource TernaryConverter}">
<Binding Path="Status" RelativeSource="{RelativeSource TemplatedParent}"/>
<Binding Source="OK"/>
<Binding Source="Unidentified"/>
<Binding Source="ERROR"/>
</MultiBinding>
</ToolTip>
</v:ColoredImage.ToolTip>
</v:ColoredImage>

我可以通过为我的第一个UserControl做一个样式/模板来解决这个问题。但我觉得我不应该这样做,不管怎样,我都想知道为什么同样的代码在一个地方有效,而在另一个地方无效。我完全惊呆了。

转换器的代码,这不是问题发生的地方,但我想有人会要求我发布它无论如何:

public class TernaryConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
int index = (int)values[0];

if (index < 0 || index > 2)
{
return values[1];
}
return values[index+1];
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new InvalidOperationException("EnumToImageConverter can only be used OneWay.");
}
}

ElementName="pn"不能在ToolTip中工作的原因是ToolTip驻留在它自己的元素树中,并且没有名为"的元素;pn";在这棵树的名称范围中。

相关内容

  • 没有找到相关文章

最新更新