2016-09-23 8 views
1

xamlのみを使用してブレンドトリガによるスタイルのプロパティを変更することは可能ですか?たとえば、最初にRadioButtonに変更イベントCheckedを発した後に、スタイルVisibilityFirstStyleに、Visibleに変更します。WPFブレンドを使用してスタイルを変更する

<Window x:Class="switch_style.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:Interactivity="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
     xmlns:Interactions="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <Style x:Key="FirstStyle" TargetType="Label" x:Name="block"> 
      <Setter Property="Visibility" Value="Collapsed"/> 
     </Style> 
    </Window.Resources> 
    <Grid> 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="auto"></RowDefinition> 
       <RowDefinition Height="auto"></RowDefinition> 
       <RowDefinition Height="auto"></RowDefinition> 
      </Grid.RowDefinitions> 
      <StackPanel Orientation="Horizontal"> 
       <Label Style="{DynamicResource FirstStyle}">First</Label> 
       <Label>Second</Label> 
       <Label>Third</Label> 
      </StackPanel> 
      <StackPanel Grid.Row="2" Orientation="Vertical"> 
       <RadioButton Width="60" HorizontalAlignment="Left" Content="First"> 
        <Interactivity:Interaction.Triggers> 
         <Interactivity:EventTrigger EventName="Checked"> 
          <Interactions:ChangePropertyAction TargetName="{Binding block}" PropertyName="Visibility" Value="Visible"/> 
         </Interactivity:EventTrigger> 
        </Interactivity:Interaction.Triggers> 
       </RadioButton> 
       <RadioButton Width="60" HorizontalAlignment="Left">Second</RadioButton> 
       <RadioButton Width="60" HorizontalAlignment="Left">Third</RadioButton> 
      </StackPanel> 
     </Grid> 
    </Grid> 
</Window> 
+0

RadioButtonがチェックされているかどうかによって、ラベルを表示/非表示にする場合は、Labelの可視性をRadioButtonのIsCheckedプロパティに直接バインドしないでください。 – sthotakura

+0

@sthotakura、多分それはいい考えです。私は1つのスタイルを使用する必要があり、それらの場合、ボタンのプロパティをチェックするためにラベルの可視性をバインドする必要があります。しかし、どのようにValue = {Binding ...}をスタイルでコントロールプロパティにバインドするのですか? – A191919

+0

うーん..それはトリッキーです。私の答えを見てください。 – sthotakura

答えて

1

Style目的は、Controlに印加されるモーメント不変となります。このStyleがまだ適用されていない場合は、変更できます。

したがって、別の2つのStylesを作成し、Triggerに基づいてStyleを選択する必要があります。

1

XAMLでしかやりたくない理由が分からないので、ここで私の試行であり、動作します。

私は次のように自分のスタイルを更新:

<Style x:Key="FirstStyle" TargetType="Label"> 
    <Setter Property="Visibility" Value="Collapsed"/> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding IsChecked}" Value="True"> 
      <Setter Property="Visibility" Value="Visible"/> 
     </DataTrigger> 
    </Style.Triggers> 
    </Style> 

をそして、私が対応するRadioButton秒にLabelの上DataContextを設定します。ここでは、完全なXAMLです:

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Page.Resources> 
     <Style x:Key="FirstStyle" TargetType="Label"> 
     <Setter Property="Visibility" Value="Collapsed"/> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding IsChecked}" Value="True"> 
       <Setter Property="Visibility" Value="Visible"/> 
      </DataTrigger> 
     </Style.Triggers> 
     </Style> 
    </Page.Resources> 
    <Grid> 
     <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="auto"/> 
      <RowDefinition Height="auto"/> 
      <RowDefinition Height="auto"/> 
     </Grid.RowDefinitions> 
     <StackPanel Orientation="Horizontal"> 
      <Label Content="First" DataContext="{Binding ElementName=radioButton1}" Style="{DynamicResource FirstStyle}"/> 
      <Label Content="Second" DataContext="{Binding ElementName=radioButton2}" Style="{DynamicResource FirstStyle}"/> 
      <Label Content="Third" DataContext="{Binding ElementName=radioButton3}" Style="{DynamicResource FirstStyle}"/> 
     </StackPanel> 
     <StackPanel Grid.Row="2" Orientation="Vertical"> 
      <RadioButton 
       x:Name="radioButton1" 
       Width="60" 
       HorizontalAlignment="Left" 
       Content="First"/> 
      <RadioButton 
       x:Name="radioButton2" 
       Width="60" 
       HorizontalAlignment="Left" 
       Content="Second"/> 
      <RadioButton 
       x:Name="radioButton3" 
       Width="60" 
       HorizontalAlignment="Left" 
       Content="Third"/> 
     </StackPanel> 
     </Grid> 
    </Grid> 
</Page> 

我々はバッキングのViewModel上の同じプロパティにRadioButtonIsCheckedLabelの可視性をバインドすることができれば、それはおそらくより簡単だっただろう。

この問題のもう1つのアプローチは、@ AnjumSKhanの答えです。

関連する問題