0

I have a button in WPF and I want to make it visible if the mouse is over the border the button is in. This is simple:

                    <Button Grid.Column="1" Click="DimFilter_Click" Style="{StaticResource ImageButton}" MouseDown="Button_MouseDown"
                            Visibility="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Border}}, Path=IsMouseOver, Converter={StaticResource BoolToVis}}">
                        <Button.Content>
                            <Image Source="{Binding FilterActive, Converter={StaticResource FilterImageConverter}}"
                                   HorizontalAlignment="Center" VerticalAlignment="Center"/>
                        </Button.Content>
                    </Button>

My problem is that I also want to make button visible if the Property "FilterActive" is true. So if "FilterActive" is false I want to use the MouseOver Binding in the Code above, but if "FilterActive" is true, the Button should be visible all the time, ignoring the first binding. Is this possible in any way?

  • You could use a MultiBinding. – Clemens Oct 16 '15 at 08:16
  • Clemens, can multi binding give precedence to one property (FilterActive) over another (MouseOver)? If not, maybe the only way is via code-behind. – logcat Oct 16 '15 at 08:43
  • Possible duplicate of [C# WPF IsEnabled using multiple bindings?](http://stackoverflow.com/questions/945427/c-sharp-wpf-isenabled-using-multiple-bindings) – stijn Oct 16 '15 at 08:46

2 Answers2

1

You could use triggers rather than a binding:

<Button Grid.Column="1" 
        Click="DimFilter_Click" 
        MouseDown="Button_MouseDown">                     
    <Button.Style>
        <Style BasedOn="{StaticResource ImageButton}" TargetType="Button">

            <Setter Property="Visibility" Value="Collapsed" />

            <Style.Triggers>                              
                <DataTrigger Binding="{Binding FilterActive}" Value="True">
                    <Setter Property="Visibility" Value="Visible" />
                </DataTrigger>

                <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Border}}, Path=IsMouseOver, Converter={StaticResource BoolToVis}}" Value="True">
                    <Setter Property="Visibility" Value="Visible" />
                </DataTrigger>                                  
            </Style.Triggers>

        </Style>
    </Button.Style>
    <Button.Content>
        <Image Source="{Binding FilterActive, Converter={StaticResource FilterImageConverter}}"
                    HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Button.Content>
</Button>
GazTheDestroyer
  • 20,722
  • 9
  • 70
  • 103
1

Okay I got it, stupid me.

<Button.Visibility>
    <MultiBinding Converter="{StaticResource ButtonVisConverter}">
          <Binding Path="FilterActive"/>
          <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Border}}" Path="IsMouseOver"/>
     </MultiBinding>
</Button.Visibility>

The code in the converter is pretty much self explanatory