0

So i am at a complete loss why the exact same binding works for one element but not another (on the same control, code for binding is copy and pasted).

I have made a MultiValueConverter that takes in 4 values. values[0] determines which one of the values[1-3] should be returned. (Ternary logic)

This converter works great. I use this to choose which color and image a control should have based on an enum. But, when using the same converter for tooltip to choose between string, then i get a binding error.

The weird thing is that is that when i use the same converter inside a template for choosing which string for the ToolTip, then it works! The exact same code copy and pasted.

When i bind with the ToolTip (not in a template) the value[0] is "{DependencyProperty.UnsetValue}", instead of the enum that i have binded to.

Code inside a 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>

Code Inside a Style and ControlTemplate (this code work, even though it is the same)

<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>

I could fix this by doing a style/template for my first UserControl. But i feel like i shouldnt have too, and either way i wanna know why the EXACT same code works in one place but not another. I'm completely dumbfounded.

Code for the Converter, this is not where problem occurs, but i figured someone is going to ask me to post it anyway:

    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.");
    }
}
morknox
  • 87
  • 8

1 Answers1

0

The reason why ElementName="pn" doesn't work in a ToolTip is that a ToolTip resides in its own element tree and there is no element named "pn" in the namescope of this tree.

mm8
  • 163,881
  • 10
  • 57
  • 88