DataTrigger на RadioButton IsChecked - PullRequest
4 голосов
/ 18 мая 2011

У меня есть сценарий, в котором мне нужно скрыть некоторый контент в зависимости от того, включена или выключена кнопка-переключатель. По некоторым причинам я не могу заставить это работать так, как я ожидаю. Поведение противоположно тому, что я ожидаю. Если я настрою свой xaml так, чтобы он соответствовал фактическому поведению, которое я вижу, все будет скрыто.

По сути, у меня есть две кнопки с надписью Fixed и Cycle. Когда установлен флажок Fixed, я хочу, чтобы текстовое поле, связанное с Fixed, имело видимый передний план, а текстовое поле, связанное с Cycle, должно иметь прозрачный передний план, и наоборот. То, что я вижу, является полной противоположностью.

Вот мой триггер:

<Grid.Resources>
  <Style TargetType="TextBox" x:Key="FixedModeStyle">
    <Setter Property="Foreground" Value="Transparent" />
    <Setter Property="Width" Value="40" />
    <Setter Property="Height" Value="20" />
    <Setter Property="Margin" Value="10" />
    <Style.Triggers>
      <DataTrigger Binding="{Binding IsChecked, 
                             ElementName=rbtFixedMode}" Value="True" >
        <Setter Property="Foreground" 
                Value="{DynamicResource My.Fonts.Global.LightForeground}" />
      </DataTrigger>
      </Style.Triggers>                  
  </Style>
  <Style TargetType="TextBox" x:Key="CycleModeStyle">
    <Setter Property="Foreground" Value="Transparent" />
    <Setter Property="Width" Value="40" />
    <Setter Property="Height" Value="20" />
    <Setter Property="Margin" Value="10" />
    <Style.Triggers>
      <DataTrigger Binding="{Binding IsChecked, 
                   ElementName=rbtCycleMode}" Value="True" >
        <Setter Property="Foreground" 
                Value="{DynamicResource My.Fonts.Global.LightForeground}" />
      </DataTrigger>
    </Style.Triggers>
  </Style>
</Grid.Resources>

Вот мои переключатели и связанные текстовые поля:

<RadioButton x:Name="rbtFixedMode" Content="Fixed" 
             GroupName="AveragingMode"
             Foreground="{DynamicResource My.Fonts.Global.LightForeground}" 
             IsChecked="{Binding AveragingWindowMode, 
                  Converter={StaticResource EnumToBooleanConverter}, 
                  ConverterParameter={x:Static  Processors:AveragingMode.Fixed}}" />
<DockPanel Grid.Row="1" IsEnabled="{Binding IsChecked, ElementName=rbtFixedMode}">
  <TextBox x:Name="txtFixedIntervalLength" 
           Style="{StaticResource FixedModeStyle}" DockPanel.Dock="Left" 
           Text="{Binding AveragingWindowFixedLength}" />
</DockPanel>

<RadioButton x:Name="rbtCycleMode" Content="Cycle" 
             GroupName="AveragingMode" Grid.Row="2"
             Foreground="{DynamicResource My.Fonts.Global.LightForeground}"                           
             IsChecked="{Binding AveragingWindowMode, 
                  Converter={StaticResource EnumToBooleanConverter}, 
                  ConverterParameter={x:Static Processors:AveragingMode.Cycles}}" />

<DockPanel Grid.Row="3" IsEnabled="{Binding IsChecked, ElementName=rbtCycleMode}">
  <TextBox x:Name="txtCycleIntervalLength" 
           Style="{StaticResource CycleModeStyle}" DockPanel.Dock="Left"  
           Text="{Binding AveragingWindowCycleLength}"/>
  <TextBlock x:Name="txbCycles" Text="Cycles" Margin="4,10"
             Foreground="{DynamicResource My.Fonts.Global.LightForeground}" />
</DockPanel>

Есть идеи?

Ответы [ 2 ]

1 голос
/ 18 мая 2011

Если вы используете привязку для установки значений ваших переключателей, не используйте группы.Если вы используете группы, не используйте привязку.Эти двое плохо играют вместе.

Это может быть не причиной того, что вы видите.Но держу пари, что это так.И это, безусловно, мешает вашей способности диагностировать проблему, потому что после того, как вы начинаете нажимать на кнопки, их привязка больше не работает.

1 голос
/ 18 мая 2011

Просто сделать текст прозрачным - плохая идея, пользователь по-прежнему сможет редактировать его, пока он прозрачный. Помимо того, что этот код частично запутан и избыточен, не создавайте два стиля для TextBox, оба из которых содержат одинаковые установщики, создайте базовый стиль и используйте BasedOn для подстилей.

Не совсем уверен, где ваш код работает неправильно, я бы посоветовал вам исправить его, возможно, есть какая-то логическая ошибка, также вот рабочий пример, который вы можете добавить в Kaxaml :

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:sys="clr-namespace:System;assembly=mscorlib">
  <Page.Resources>

  </Page.Resources>
  <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
      <Grid>
      <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
      </Grid.RowDefinitions>
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
      </Grid.ColumnDefinitions>
        <RadioButton Name="rbCycle" GroupName="g1" Content="Cycle"/>
        <RadioButton Name="rbFixed" GroupName="g1" Content="Fixed" Grid.Column="1"/>
        <TextBox Grid.Row="1" Text="cycle box">
            <TextBox.Style>
                <Style TargetType="{x:Type TextBox}">
                    <Setter Property="Visibility" Value="Hidden"/>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsChecked, ElementName=rbCycle}" Value="True">
                            <Setter Property="Visibility" Value="Visible"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBox.Style>
        </TextBox>
        <TextBox Grid.Row="1" Grid.Column="1" Text="fixed box">
            <TextBox.Style>
                <Style TargetType="{x:Type TextBox}">
                    <Setter Property="Visibility" Value="Hidden"/>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsChecked, ElementName=rbFixed}" Value="True">
                            <Setter Property="Visibility" Value="Visible"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBox.Style>
        </TextBox>
      </Grid>
  </ScrollViewer>
</Page>
...