2008-12-16 14 views
6

Ich habe einen Button, der auf 2 Comboboxen schaut, um sicherzustellen, dass sie einen Wert haben, bevor es aktiviert ist. Das Problem ist die Art, wie ich es tue, überschreibt den Standardstil, der in meinem Themaprojekt erklärt wird.WPF-Button IsEnabled basierend auf ComboBox Auswahl Überschreiben Standard-Stil

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

Ich habe versucht, das Hinzufügen BasedOn = "{StaticResouce MyDefaultButtonStyleName}" mit dem Stil-Tag, aber es bläst zur Laufzeit auf.

Der Fehler ist "'System.Windows.Style' Wert kann nicht zugewiesen werden Eigenschaft 'Stil' des Objekts 'System.Windows.Controls.Button'. Kann nur auf einem Stil mit Zieltyp, der Basistyp 'basiert IFrameworkInputElement '. Fehler beim Objekt' System.Windows.Style 'in der Markup-Datei "

Gibt es eine Möglichkeit, dies in XAML zu tun, ohne den Standard-Stil zu überschreiben.

EDIT: Codebeispiel aktualisiert. Ich erhalte einen Fehler bei OKButtonStyle mit der Aussage "Kann der Ressource kein Element hinzufügen", da die Eigenschaft nur ein untergeordnetes Element haben kann, wenn sie ein explizites Sammlungs-Tag verwendet. Fehler beim Objekt 'System.Windows.Style' in der Markup-Datei "

<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

Können Sie uns auch für OKButtonStyle die Definition zeigen? –

+0

Der Stil in Button.Style benötigt einen TargetType. –

Antwort

9

Wie ist das

BasedOn="{StaticResouce DefaultButton}" 

soll auf die Standardschaltfläche Stil beziehen? Dies stürzt ab, weil DefaultButton eine nicht definierte Ressource in Ihrer App ist.

es sein sollte:

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

EDIT: Sorry, antwortete hastig zu.

Ich bemerkte, dass jetzt Ihre Schaltfläche einen Style = {} hat und auf einen Stil namens OkBUttonStyle verweist. Dies ist der Stil, der alles definieren und auf dem Standard-Button-Stil basieren sollte. Bei allem schließe ich diese Auslöser ein. Was Sie im XAML sagen, ist, dass Stil der Inhalt Ihrer Schaltfläche ist.

Vielleicht werden einige Code helfen:

<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}" ist eine benannte style-Instanz basierend auf x: Type Schaltfläche ex: .... – Nate

+0

Entschuldigung wegen dieser Größe, der OKButtonStyle war ein weiterer Weg, auf dem ich versuchte, das herauszufinden. Ich nahm den Stil von innerhalb der Schaltfläche, fügte es meinen Ressourcen hinzu und versuchte dann, das auf dem DefaultButton zu basieren, aber das blies mit einem anderen Fehler auf. – Nate

Verwandte Themen