Кнопка WPF активируется на основе выбора ComboBox Перезапись стиля по умолчанию

У меня есть кнопка, которая просматривает 2 поля со списком, чтобы убедиться, что у них есть значение, прежде чем оно будет включено. Проблема в том, что я это делаю, перезаписывая стиль по умолчанию, объявленный в моем тематическом проекте.

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

Я пробовал добавить BasedOn = "{StaticResouce MyDefaultButtonStyleName}" в тег стиля, но он взрывается во время выполнения.

Ошибка: значение «System.Windows.Style» не может быть присвоено свойству «Style» объекта «System.Windows.Controls.Button». Может основываться только на Style с целевым типом, который является базовым типом «IFrameworkInputElement». Ошибка у объекта 'System.Windows.Style' в файле разметки "

Есть ли возможность сделать это в XAML без перезаписи стиля по умолчанию.

РЕДАКТИРОВАТЬ: обновлен образец кода. Я получаю сообщение об ошибке OKButtonStyle: «Невозможно добавить элемент в свойство« Ресурсы », потому что свойство может иметь только один дочерний элемент, если оно использует явный тег коллекции. Ошибка в объекте« System.Windows.Style »в файле разметки»

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

person Nate    schedule 16.12.2008    source источник
comment
Не могли бы вы также показать нам определение OKButtonStyle?   -  person Szymon Rozga    schedule 16.12.2008
comment
Для стиля внутри Button.Style требуется TargetType.   -  person Szymon Rozga    schedule 16.12.2008


Ответы (1)


Как это

BasedOn="{StaticResouce DefaultButton}"

должен относиться к стилю кнопки по умолчанию? Это дает сбой, потому что DefaultButton является неопределенным ресурсом в вашем приложении.

Должен быть:

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

РЕДАКТИРОВАТЬ: Извините, ответил слишком поспешно.

Я заметил, что теперь у вашей кнопки установлен Style = {}, и она указывает на стиль OkBUttonStyle. Это стиль, который должен определять все и основываться на стиле кнопок по умолчанию. По всему, я включаю эти триггеры. В XAML вы говорите, что Style - это содержимое вашей кнопки.

Может быть, какой-нибудь код поможет:

 <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>
person Szymon Rozga    schedule 16.12.2008
comment
BasedOn = {StaticResouce DefaultButton} - это экземпляр именованного стиля, основанный на x: Type Button ex: ‹Style x: Key = DefaultButton TargetType = {x: Type Button}› .... ‹/Style› - person Nate; 16.12.2008
comment
извините за этот размер, OKButtonStyle был еще одним путем, по которому я пошел, пытаясь понять это. Я взял стиль изнутри кнопки, добавил его в свои ресурсы, а затем попытался основать его на DefaultButton, но это взорвалось с другой ошибкой. - person Nate; 16.12.2008