2016-08-16 4 views
0

У меня есть RadioButton, который динамически настраивается как часть DataCemplate ItemsControl.Изменить стиль RadioButton в зависимости от свойства

<RadioButton GroupName="Ratings"> 
    <RadioButton.Content> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock Text="{Binding Score}" /> 
     <TextBlock Text=" - " /> 
     <TextBlock Text="{Binding Description}" /> 
    </StackPanel> 
    </RadioButton.Content> 
</RadioButton> 

У меня есть два предопределенных стилей (MyCheckedStyle1 и MyUncheckedStyle2), которые работают нормально, когда я индивидуально установить Style= свойство RadioButton, но я не нашел способ изменить стиль, основанный на это IsChecked собственность.

Большинство методов я стараюсь, чтобы попытаться дать мне исключение о Style object is not allowed to affect the Style property of the object to which it applies. (например, запускающее ContentTemplate)

Так псевдокода

if IsChecked = true then 
    style = MyCheckedStyle1 
else if IsChecked = false then 
    style = MyUncheckedStyle1 

Я могу сделать это с кодой, но я стараюсь, чтобы избежать этого, если возможно и поставить логику в XAML.

+1

Применить стиль к «Родительскому» радио, а затем с помощью триггера изменить стиль радио по свойству IsChecked. Другой способ применения стиля к самому радио , а затем с помощью триггера изменить свойство ControlTemplate по IsChecked. – codeDom

+0

Стили не определены мной, и я не могу их изменить. Ваш первый вариант звучит так, как будто он может работать, можете ли вы дать ответ, который еще больше объясняет, что вы имеете в виду? –

+0

Не можете ли вы просто изменить стиль в коде по проверенным или непроверенным событиям? –

ответ

3

Примените стиль к Родителю радио, а затем с помощью триггера измените стиль радио по свойству IsChecked.

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="101" Width="264"> 
    <Window.Resources> 

     <Style x:Key="MyCheckedStyle1" TargetType="RadioButton"> 
      <Setter Property="Background" Value="Red"/> 
     </Style> 
     <Style x:Key="MyCheckedStyle2" TargetType="RadioButton"> 
      <Setter Property="Background" Value="Blue"/> 
     </Style> 

     <Style x:Key="ParentStyle" TargetType="ContentControl"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate> 
         <RadioButton Name="RadioButton1" GroupName="Ratings" > 
          <RadioButton.Content> 
           <StackPanel Orientation="Horizontal"> 
            <TextBlock Text="{Binding Score}" /> 
            <TextBlock Text=" - " /> 
            <TextBlock Text="{Binding Description}" /> 
           </StackPanel> 
          </RadioButton.Content> 
         </RadioButton> 
         <ControlTemplate.Triggers> 
          <Trigger SourceName="RadioButton1" Property="IsChecked" Value="True"> 
           <Setter TargetName="RadioButton1" Property="Style" 
             Value="{StaticResource MyCheckedStyle1}"/> 
          </Trigger> 
          <Trigger SourceName="RadioButton1" Property="IsChecked" Value="False"> 
           <Setter TargetName="RadioButton1" Property="Style" 
             Value="{StaticResource MyCheckedStyle2}"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Window.Resources> 
    <Grid> 
     <ListBox> 
      <ContentControl Style="{StaticResource ParentStyle}"/> 
      <ContentControl Style="{StaticResource ParentStyle}"/> 
     </ListBox> 
    </Grid> 
</Window> 
Смежные вопросы