Search code examples
wpfmenuitemdatatrigger

wpf menuitem style.trigger


I am trying to implement a checkable menu, where only one menuitem is checked at a time, i.e. radio button behavior. I would like to achieve this with a style and datatriggers to keep it in xaml. The intention is to observe the other items; whenever any other is true, it should be set to false. Indeed, only one is checked at a time, however two button presses are required. How can I make it work with just one button press?

<MenuItem Header="Header">
            <MenuItem x:Name="ChangesMenuItem" Header="Changes" IsCheckable="True" Command="{Binding ViewChangesCommand}">
                <MenuItem.Style>
                    <Style TargetType="MenuItem">
                        <Style.Triggers>                                
                            <DataTrigger Binding="{Binding ElementName=SettingsMenuItem, Path=IsChecked}" Value="True">
                                <Setter Property="IsChecked" Value="False" />
                            </DataTrigger>
                            <DataTrigger Binding="{Binding ElementName=SyncMenuItem, Path=IsChecked}" Value="True">
                                <Setter Property="IsChecked" Value="False" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </MenuItem.Style>
            </MenuItem>
            <MenuItem x:Name="SettingsMenuItem" Header="Settings" IsCheckable="True" Command="{Binding ViewSettingsCommand}">
                <MenuItem.Style>
                    <Style TargetType="MenuItem">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding ElementName=ChangesMenuItem, Path=IsChecked}" Value="True">
                                <Setter Property="IsChecked" Value="False" />
                            </DataTrigger>
                            <DataTrigger Binding="{Binding ElementName=SyncMenuItem, Path=IsChecked}" Value="True">
                                <Setter Property="IsChecked" Value="False" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </MenuItem.Style>
            </MenuItem>
            <MenuItem x:Name="SyncMenuItem" Header="Sync" IsCheckable="True" Command="{Binding ViewSyncCommand}">
                <MenuItem.Style>
                    <Style TargetType="MenuItem">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding ElementName=ChangesMenuItem, Path=IsChecked}" Value="True">
                                <Setter Property="IsChecked" Value="False" />
                            </DataTrigger>
                            <DataTrigger Binding="{Binding ElementName=SettingsMenuItem, Path=IsChecked}" Value="True">
                                <Setter Property="IsChecked" Value="False" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </MenuItem.Style>
            </MenuItem>
        </MenuItem>

Solution

  • I have a header which changes according to the selection, so I decided to bind to that property.

    <Menu>
            <MenuItem Header="{Binding Header}">
                <MenuItem x:Name="ChangesMenuItem" Header="Changes" IsCheckable="True" Command="{Binding ViewChangesCommand}">
                    <MenuItem.Style>
                        <Style TargetType="MenuItem">
                            <Setter Property="IsChecked" Value="False"/>
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding Header}" Value="Changes">
                                    <Setter Property="IsChecked" Value="True"/>
                                </DataTrigger>                                                             
                            </Style.Triggers>                            
                        </Style>
                    </MenuItem.Style>                   
                </MenuItem>
                <MenuItem x:Name="SettingsMenuItem" Header="Settings" IsCheckable="True" Command="{Binding ViewSettingsCommand}">
                    <MenuItem.Style>
                        <Style TargetType="MenuItem">
                            <Setter Property="IsChecked" Value="False"/>
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding Header}" Value="Settings">
                                    <Setter Property="IsChecked" Value="True"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </MenuItem.Style>
                </MenuItem>
                <MenuItem x:Name="SyncMenuItem" Header="Sync" IsCheckable="True" Command="{Binding ViewSyncCommand}">
                    <MenuItem.Style>
                        <Style TargetType="MenuItem">
                            <Setter Property="IsChecked" Value="False"/>
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding Header}" Value="Sync">
                                    <Setter Property="IsChecked" Value="True"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </MenuItem.Style>
                </MenuItem>
            </MenuItem>
        </Menu>