Domanda

I want to make a trigger with a converter which returns true if one of the binded properties is true.

like this

public class TestConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values != null && values.All(x => x is bool)) 
            return values.OfType<bool>().Any(x => x);
        return false;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

and implemented it in a button

    <Button Width="100" Height="100" Content="CONTENT">
        <Button.Template>
            <ControlTemplate TargetType="Button">
                <Grid Background="{TemplateBinding Background}">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                </Grid>
                 <ControlTemplate.Triggers>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Value="True" >
                                <Condition.Binding>
                                    <MultiBinding>
                                        <MultiBinding.Converter>
                                            <WpfApplication2:TestConverter />
                                        </MultiBinding.Converter>
                                        <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Button.IsMouseOver"></Binding>
                                        <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Button.IsKeyboardFocusWithin"></Binding>
                                    </MultiBinding>
                                </Condition.Binding>
                            </Condition>
                        </MultiDataTrigger.Conditions>
                        <MultiDataTrigger.Setters>
                            <Setter Property="Foreground" Value="White" />
                        </MultiDataTrigger.Setters>
                    </MultiDataTrigger>
                 </ControlTemplate.Triggers>
            </ControlTemplate>
        </Button.Template>
    </Button>

But the only values I get in the converter are DependencyProperty.Unsetvalue. Do anyone knows who to fix this Multibinding?

I also tried

<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Button}}" Path="IsMouseOver"></Binding>
<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Button}}" Path="IsKeyboardFocusWithin"></Binding>

but that also doesn't work

È stato utile?

Soluzione

You'll need to change Binding to {RelativeSource Self} and remove Button from the Binding.Path. Another thing is that you don't really need MultiTrigger. DataTrigger with MultiBinding will be enough in your case:

<Button Width="100" Height="100" Content="CONTENT">
    <Button.Template>
        <ControlTemplate TargetType="Button">
            <Grid Background="{TemplateBinding Background}">
                <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
            </Grid>
            <ControlTemplate.Triggers>
                <DataTrigger Value="True">
                    <DataTrigger.Binding>
                        <MultiBinding>
                            <MultiBinding.Converter>
                                <WpfApplication2:TestConverter />
                            </MultiBinding.Converter>
                            <Binding RelativeSource="{RelativeSource Self}" Path="IsMouseOver"></Binding>
                            <Binding RelativeSource="{RelativeSource Self}" Path="IsKeyboardFocusWithin"></Binding>
                        </MultiBinding>
                    </DataTrigger.Binding>
                    <Setter Property="Foreground" Value="White" />                        
                </DataTrigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Button.Template>
</Button>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top