WPF Button IsEnabled Based on a selection of ComboBox Overwriting default style

I have a button that looks at 2 comboboxes to make sure they matter before it is turned on. The problem is how I do this by rewriting the default style declared in my theme project.

<Button x:Name="btnOK" VerticalAlignment="Center" Content="OK" IsDefault="True" Margin="0" Click="btnOK_Click"> <Button.Style> <Style BasedOn="{StaticResource DefaultButton}"> <Style.Triggers> <DataTrigger Binding="{Binding ElementName=ddlWageTypes, Path=SelectedItem}" Value="{x:Null}"> <Setter Property="Button.IsEnabled" Value="false"/> </DataTrigger> <DataTrigger Binding="{Binding ElementName=ddlJobTitles, Path=SelectedItem}" Value="{x:Null}"> <Setter Property="Button.IsEnabled" Value="false"/> </DataTrigger> </Style.Triggers> </Style> </Button.Style> </Button> 

I tried to add style BasedOn = "{StaticResouce MyDefaultButtonStyleName}" to the tag, but it explodes at runtime.

Error: The value "System.Windows.Style" cannot be assigned to the "Style" property of the "System.Windows.Controls.Button" object. It can only be based on a style with a target type, which is the base type of the "IFrameworkInputElement" Error in the object "System.Windows.Style" in the markup file "

Should it do in XAML without overwriting the default style.

EDIT: Updated sample code. I get an "OKButtonStyle" error message saying "I canโ€™t add an item to the Resources property because the property can have only one child if it uses an explicit collection tag. Error in the" System.Windows.Style "object in the file markup "

 <UserControl x:Class="UK.Budgeting.XBAP.ShiftDiff.NewFTEPremiumPaySummary" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:compModel="clr-namespace:System.ComponentModel;assembly=WindowsBase" xmlns:local="clr-namespace:UK.Budgeting.XBAP.ShiftDiff"> <UserControl.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="CellTemplates.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> <Style TargetType="{x:Type Button}" x:Key="OKButtonStyle" BasedOn="{StaticResource DefaultButton}"> <Style.Triggers> <DataTrigger Binding="{Binding ElementName=ddlWageTypes, Path=SelectedItem}" Value="{x:Null}"> <Setter Property="Button.IsEnabled" Value="false"/> </DataTrigger> <DataTrigger Binding="{Binding ElementName=ddlJobTitles, Path=SelectedItem}" Value="{x:Null}"> <Setter Property="Button.IsEnabled" Value="false"/> </DataTrigger> </Style.Triggers> </Style> </UserControl.Resources> <Grid> <Rectangle Style="{StaticResource DialogRectangle}"/> <Border Style="{StaticResource DialogBorder}"> <Grid HorizontalAlignment="Center" VerticalAlignment="Center" Background="White"> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition Width="5"/> <ColumnDefinition MinWidth="300"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition Height="2"/> <RowDefinition/> <RowDefinition Height="2"/> <RowDefinition/> <RowDefinition Height="2"/> <RowDefinition/> </Grid.RowDefinitions> <TextBlock Grid.Column="0" Grid.Row="0" Style="{StaticResource LabelStyle}">Wage Type</TextBlock> <TextBlock Grid.Column="0" Grid.Row="2" Style="{StaticResource LabelStyle}">Job Title</TextBlock> <ComboBox x:Name="ddlWageTypes" VerticalAlignment="Top" Grid.Column="2" Grid.Row="0" DisplayMemberPath="DisplayName" SelectedValuePath="WageTypeCode"/> <ComboBox x:Name="ddlJobTitles" VerticalAlignment="Top" Grid.Column="2" Grid.Row="2" DisplayMemberPath="JobTitle" SelectedValuePath="JobCode"/> <StackPanel Grid.Column="2" Grid.Row="6" VerticalAlignment="Top" Orientation="Horizontal" Margin="5"> <Button x:Name="btnOK" VerticalAlignment="Center" Content="OK" IsDefault="True" Margin="0" Click="btnOK_Click" Style="{StaticResource OKButtonStyle}"/> <Button x:Name="btnCancel" VerticalAlignment="Center" Content="Cancel" IsCancel="True" Margin="10,0,0,0" Click="btnCancel_Click"/> </StackPanel> </Grid> </Border> </Grid> </UserControl> 
+6
styles wpf xaml isenabled
source share
1 answer

Like this

 BasedOn="{StaticResouce DefaultButton}" 

Is the default button style link supposed to be? This crashes because the DefaultButton is an undefined resource in your application.

It should be:

 BasedOn="{StaticResource {x:Type Button}}" 

EDIT: Sorry, answered too hastily.

Now I noticed that your button has a set of Style = {} and points to a style called OkBUttonStyle. This is a style that should define everything and be based on the default button style. In everything, I include these triggers. What you say in XAML is that Style is the content of your button.

Maybe some code will help:

  <Window x:Class="WindowsApplication7.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="WindowsApplication7" Height="300" Width="300" > <Window.Resources> <Style TargetType="{x:Type Button}" x:Key="defaultButtonStyle"> <Setter Property="Background" Value="Red" /> </Style> <Style TargetType="{x:Type Button}" x:Key="okButtonStyle" BasedOn="{StaticResource defaultButtonStyle}"> <Setter Property="Foreground" Value="Green" /> <Style.Triggers> <Trigger Property="IsEnabled" Value="True"> <Setter Property="Background" Value="Yellow" /> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Foreground" Value="Blue" /> </Trigger> </Style.Triggers> </Style> </Window.Resources> <StackPanel> <Button>System default</Button> <Button Style="{StaticResource defaultButtonStyle}">My Default</Button> <Button Style="{StaticResource okButtonStyle}">Ok</Button> <Button Style="{StaticResource okButtonStyle}" IsEnabled="False">Ok disabled</Button> </StackPanel> </Window> 
+9
source share

All Articles