简体   繁体   中英

Cant set Style in Trigger wpf

i want to change style when toggle button checked

<ToggleButton.Style>
                <Style TargetType="ToggleButton" BasedOn="{StaticResource ToggleButtonPrimary}">
                    <Style.Triggers>

                        <DataTrigger Binding="{Binding ElementName=ButtonNude, Path=IsChecked}" Value="True">
                            <Setter Property="Style" Value="{StaticResource ToggleButtonDanger}"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ToggleButton.Style>

but my code not work and app crash

As suggested by @clemens , the right way would be to have template and apply in controlTemplate with TargetName

There is one more (may be ugly) way:

On view:

    <StackPanel>
            <StackPanel.Resources>
                <local:Myconverter x:Key="MyConverter" />

                <Style TargetType="ToggleButton" x:Key="ToggleButtonPrimary">
                    <Setter Property="Background" Value="blue" />
                </Style>

                <Style TargetType="ToggleButton" x:Key="ToggleButtonDanger">
                    <Setter Property="Background" Value="Red" />
                </Style>
            </StackPanel.Resources>

            <CheckBox Margin="20" x:Name="chk" />

            <ToggleButton Width="100" Height="100" >
                <ToggleButton.Style>
                    <MultiBinding Converter="{StaticResource MyConverter}">
                        <MultiBinding.Bindings>
                            <Binding ElementName="chk" Path="IsChecked"/>                            
                            <Binding RelativeSource="{RelativeSource AncestorType=StackPanel}"/>                            
                        </MultiBinding.Bindings>
                    </MultiBinding>
                </ToggleButton.Style>            
            </ToggleButton>
        </StackPanel>

Converter:

    public class Myconverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            if ((bool)values[0])
            {
                return (values[1] as FrameworkElement).Resources["ToggleButtonDanger"];
            }
            else
                return (values[1] as FrameworkElement).Resources["ToggleButtonPrimary"];            
        }


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

    }

Hope that helps.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM