2011-05-17 3 views
3

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

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

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

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

Любые идеи?

+0

Оказывается, проблема была между клавиатурой и пользователем. По-видимому, разработчик в команде изменил стиль LightForeground, который я использовал в своих текстовых окнах, чтобы цвет, такой же, как и мой фон, что дало им прозрачный вид. Благодаря @ H-B и @ robert-rossney их предложения. – KyleLib

ответ

1

Просто сделать текст прозрачным - это плохая идея, пользователь все равно сможет редактировать его, пока он прозрачен. Кроме того, что код является каким-то запутанным и избыточным, не создавайте два стиля для 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> 
+0

Спасибо за ввод. Я согласен с вашим заявлением относительно скрытия текста. FWIW, я также отключил док-панель, содержащую текстовое поле, чтобы не дать пользователю сосредоточиться на нем. Требования - предоставить функцию настроек, в которой пользователь указывает, как должен быть усреднен поток числовых выборок. Выбор - это ** фиксированный ** временной интервал или ряд ** циклов **, учтенных в герцах. Существует дополнительный контент, который сочетается с текстовыми полями, такими как единицы времени и т. Д., Которые я оставил для краткости, которые только вымерли в контексте отмеченного флажка. – KyleLib

1

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

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

Смежные вопросы