2008-12-16 11 views
6

J'ai un bouton qui regarde 2 comboboxes pour s'assurer qu'ils ont une valeur avant qu'il ne soit activé. Le problème est que je le fais est en train d'écraser le style par défaut déclaré dans mon projet de thème.WPF Button IsEnabled Basé sur le style par défaut de ComboBox Selection Overwriting

<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> 

J'ai essayé d'ajouter BasedOn = "{} StaticResouce MyDefaultButtonStyleName" à la balise de style mais il explose lors de l'exécution.

L'erreur est que la valeur "'System.Windows.Style' ne peut pas être affectée à la propriété 'Style' de l'objet 'System.Windows.Controls.Button'. Ne peut s'appuyer que sur un style avec un type de cible de type base ' IFrameworkInputElement 'Erreur sur l'objet' System.Windows.Style 'dans le fichier de balisage "

Y a-t-il une action à effectuer dans XAML sans écraser le style par défaut.

EDIT: Exemple de code mis à jour. Je reçois une erreur sur OKButtonStyle disant "Impossible d'ajouter un élément à la propriété 'Resources', car la propriété ne peut avoir qu'un seul élément enfant s'il utilise une balise de collection explicite Erreur sur l'objet 'System.Windows.Style' dans le fichier de balisage"

<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> 
+0

Pourriez-vous nous montrer aussi la définition de OKButtonStyle? –

+0

Le style à l'intérieur de Button.Style a besoin d'un TargetType. –

Répondre

9

Comment est-ce

BasedOn="{StaticResouce DefaultButton}" 

censé se référer au style de bouton par défaut? Cela se bloque car DefaultButton est une ressource non définie dans votre application.

Il devrait être:

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

EDIT: Désolé, a répondu trop vite.

J'ai remarqué que votre bouton a un Style = {} set, et pointe vers un style appelé OkBUttonStyle. C'est le style qui devrait définir tout et être basé sur le style de bouton par défaut. Par tout, j'inclus ces déclencheurs. Ce que vous dites dans le XAML est que le style est le contenu de votre bouton.

Peut-être un peu de code aidera:

<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> 
+0

BasedOn = "{StaticResouce DefaultButton}" est une instance de style nommée basée sur x: Type Bouton ex: Nate

+0

désolé pour cette taille, le OKButtonStyle était un autre chemin que je suis descendu en essayant de comprendre cela. J'ai pris le style à partir du bouton, l'ai ajouté à mes ressources et j'ai ensuite essayé de le baser sur le DefaultButton mais ça a explosé avec une erreur différente. – Nate