Question

I have the following xaml for a toggle button:

<ToggleButton Margin="0,3" Grid.Row="3" Grid.ColumnSpan="2" Command="{Binding DataContext.SelectAllCommand, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}">
  <ToggleButton.Style>
   <Style TargetType="{x:Type ToggleButton}">
       <Setter Property="Content" Value="Select All"/>
       <Style.Triggers>
            <Trigger Property="IsChecked" Value="True">
                <Setter Property="Content" Value="Select None"/>
                <Setter Property="Command" Value="{Binding DataContext.SelectNoneCommand, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"/>
            </Trigger>
          </Style.Triggers>
      </Style>
  </ToggleButton.Style>
</ToggleButton>

But the IsChecked property never gets updated when clicking the button.

If I use snoop and force the IsChecked to True then the trigger kicks in.

Was it helpful?

Solution

I tried your ToggleButton and it's working fine. The only problem I see with it is that you set Command explictly. It should be done with a Setter instead (like you did with Content) to not break the Trigger.

<ToggleButton Name="toggleButton" Margin="0,3" Grid.Row="3" Grid.ColumnSpan="2">
    <ToggleButton.Style>
        <Style TargetType="{x:Type ToggleButton}">
            <Setter Property="Content" Value="Select All"/>
            <Setter Property="Command"
                    Value="{Binding DataContext.SelectAllCommand,
                                    Mode=OneWay,
                                    RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"/>
            <Style.Triggers>
                <Trigger Property="IsChecked" Value="True">
                    <Setter Property="Content" Value="Select None"/>
                    <Setter Property="Command" Value="{Binding DataContext.SelectNoneCommand, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ToggleButton.Style>
</ToggleButton>

If you're still unable to Click it, I'd check if IsHitTestVisible or similar is set to False further up the Visual Tree.

If you want to compare your version to my test app to see what's not working, I uploaded it here: http://www.mediafire.com/?ik24ftsfw2wwfwb

OTHER TIPS

Fixed it by parameterising my command, binding to a new property on my viewmodel and moving Command into the style:

               <ToggleButton Margin="0,3" Grid.Row="3" Grid.ColumnSpan="2" IsThreeState="False" 
                            IsChecked="{Binding DataContext.IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}">
                    <ToggleButton.Style>
                        <Style TargetType="{x:Type ToggleButton}">
                            <Setter Property="Content" Value="Select All"/>
                            <Setter Property="Command" Value="{Binding DataContext.SelectAllCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"/>                                
                            <Style.Triggers>
                                <Trigger Property="IsChecked" Value="True">
                                    <Setter Property="Content" Value="Select None"/>                                
                                </Trigger>
                            </Style.Triggers>
                        </Style>
                    </ToggleButton.Style>
                </ToggleButton>

Don't you just love WPF sometimes!

Just a guess, but remove the Binding Mode=OneWay and try again.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top