【问题标题】:DataTrigger on RadioButton IsCheckedRadioButton 上的 DataTrigger IsChecked
【发布时间】:2011-08-27 14:21:28
【问题描述】:

我有一个场景,我需要根据单选按钮是选中还是未选中来隐藏一些内容。出于某种原因,我无法让它按照我期望的方式工作。这种行为与我的预期相反。如果我调整我的 xaml 以适应我看到的实际行为,一切都会被隐藏。

基本上我拥有的是两个标记为“固定”和“循环”的单选按钮。检查固定后,我希望与固定相关联的文本框具有可见前景,与周期相关联的文本框以具有透明前景,反之亦然。我看到的是完全相反的。

这是我的触发器:

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

有什么想法吗?

【问题讨论】:

  • 原来问题出在键盘和用户之间。显然,团队中的一位开发人员将我在文本框上使用的 LightForeground 样式更改为与我的背景相同的颜色,从而使它们具有透明的外观。感谢@H-B 和@robert-rossney 他们的建议。

标签: wpf xaml checkbox datatrigger


【解决方案1】:

只是让文本透明是个坏主意,用户仍然可以在它透明的情况下对其进行编辑。除此之外,代码是混淆和冗余的。不要为 TextBox 创建两种样式,它们都包含相同的设置器;创建一个基本样式并将BasedOn 用于子样式。

不太清楚你的代码哪里出错了,我建议你清理一下,也许有一些逻辑错误,这里也是一个工作示例:

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

【讨论】:

  • 感谢您的意见。我同意你关于隐藏文字的说法。 FWIW,我还禁用了包含文本框的停靠面板,以防止用户关注它。要求是提供一个设置功能,用户可以在其中指定如何平均数字样本流。选择是固定时间间隔,或以赫兹为单位的周期数。文本框还有其他内容,例如时间单位等,为了简洁起见,我省略了这些内容,这些内容仅在选中的复选框的上下文中有意义。
【解决方案2】:

如果您使用绑定来设置单选按钮的值,请不要使用组。如果您使用组,请不要使用绑定。两者配合得不好。

这可能不是您所看到的原因。但我敢打赌。这肯定会干扰您诊断问题的能力,因为在您开始单击按钮后,它们的绑定不再起作用。

【讨论】:

    猜你喜欢
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 2012-10-23
    • 2011-06-16
    • 1970-01-01
    • 2012-04-12
    相关资源
    最近更新 更多