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

eyh26e7m  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(99)

所以我完全不明白为什么完全相同的绑定对一个元素有效,而对另一个元素无效(在同一个控件上,绑定的代码是复制和粘贴)。
我做了一个多值转换器,需要在4个值。values[0]决定返回[1-3]中的哪一个值。(三重逻辑)
这个转换器工作得很好。我使用它来选择控件应该基于枚举的颜色和图像。但是,当使用相同的工具提示转换器来选择字符串时,我会得到一个绑定错误。
奇怪的是,当我在模板中使用相同的转换器来选择工具提示的字符串时,它就工作了!完全相同的代码复制和粘贴。
当我使用工具提示(不在模板中)绑定时,值[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.");
    }
}
idfiyjo8

idfiyjo81#

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

相关问题