WPF)为啥完全相同的绑定在一个地方工作,而在另一个地方却不行?

Posted

技术标签:

【中文标题】WPF)为啥完全相同的绑定在一个地方工作,而在另一个地方却不行?【英文标题】:WPF) Why does the exact same binding work in one place but not another?WPF)为什么完全相同的绑定在一个地方工作,而在另一个地方却不行? 【发布时间】:2022-01-20 06:29:46 【问题描述】:

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

我制作了一个接收 4 个值的 MultiValueConverter。 values[0] 确定应该返回哪一个 values[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>

Style 和 ControlTemplate 中的代码(此代码有效,尽管它是相同的)

<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.");
    

【问题讨论】:

“pn”是什么元素? 【参考方案1】:

ElementName="pn"ToolTip 中不起作用的原因是ToolTip 驻留在它自己的元素树中,并且在该树的名称范围内没有名为“pn”的元素。

【讨论】:

以上是关于WPF)为啥完全相同的绑定在一个地方工作,而在另一个地方却不行?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在一种情况下更改熊猫数据框列中的值很快,而在另一种情况下更改速度很慢?

为啥在一种情况下会收到带有字符串文字的不推荐使用的转换警告,而在另一种情况下却没有?

内连接恰好在一列上,而在另一列上模糊

为啥我的 history.push 在一个功能中起作用,而在另一个功能中起作用?

为啥我在一个 webpack 项目上得到“意外的令牌导入”,而在另一个项目上却没有?

为啥 load_ps() 可以在一台 PC 上工作,而不能在另一台 PC 上工作?