【问题标题】:TextBox Text binding on a RadioButton Check eventRadioButton Check 事件上的 TextBox 文本绑定
【发布时间】:2020-10-11 03:59:02
【问题描述】:

我正在尝试在 RadioButton 检查事件上绑定 TextBox 文本:

[

我想要做的是:选中“SAV”或“HORS CIRCUIT”或“AUCUNE”单选按钮,然后“Adr Mac”文本框变为空,使用此 Xaml 代码:

<TextBox x:Name="AdrMac_TxtBox">
   <TextBox.Style>
      <Style TargetType="{x:Type TextBox}">
         <Setter Property="BorderBrush" Value="Black"/>
         <Setter Property="Width" Value="100"/>
         <Setter Property="HorizontalContentAlignment" Value="Left"/>
         <Setter Property="VerticalContentAlignment" Value="Center"/>
         <Setter Property="Padding" Value="5"/>
         <Setter Property="Margin" Value="5"/>
         <Setter Property="HorizontalAlignment" Value="Left"/>
         <Style.Triggers>
            <Trigger Property="IsEnabled" Value="False">
               <Setter Property="Background" Value="LightGray"/>
               <Setter Property="Opacity" Value="0.5"/>
            </Trigger>
            <MultiDataTrigger>
               <MultiDataTrigger.Conditions>
                  <Condition Binding="{Binding Path=IsChecked,ElementName=None_Imprim_Rb}"
                                                           Value="True"/>
                  <Condition Binding="{Binding Path=IsChecked,ElementName=Sav_Rb_Checked}"
                                                           Value="True"/>
                  <Condition Binding="{Binding Path=IsChecked,ElementName=HC_Rb_Checked}"
                                                           Value="True"/>
               </MultiDataTrigger.Conditions>
               <Setter Property="Text" Value="{x:Static sys:String.Empty}"/>
            </MultiDataTrigger>
         </Style.Triggers>
      </Style>
   </TextBox.Style>
</TextBox>

你能告诉我这段代码有什么问题吗?

【问题讨论】:

  • MultiDataTrigger 如果满足 所有 条件,则执行 Setter。当您为每个条件定义单独的触发器时,您可能会成功。

标签: c# wpf xaml


【解决方案1】:

MultiDataTrigger 只会在满足所有条件时应用设置器。

表示当绑定数据满足一组条件时应用属性值或执行操作的触发器。

您可以改为定义多个DataTriggers,每个DataTriggers 作用于一个条件。

<Style.Triggers>
   <!-- ...other tiggers. -->
   <DataTrigger Binding="{Binding Path=IsChecked,ElementName=None_Imprim_Rb}" Value="True">
      <Setter Property="Text" Value="{x:Static sys:String.Empty}"/>
   </DataTrigger>
   <DataTrigger Binding="{Binding Path=IsChecked,ElementName=Sav_Rb_Checked}" Value="True">
      <Setter Property="Text" Value="{x:Static sys:String.Empty}"/>
   </DataTrigger>
   <DataTrigger Binding="{Binding Path=IsChecked,ElementName=HC_Rb_Checked}" Value="True">
      <Setter Property="Text" Value="{x:Static sys:String.Empty}"/>
   </DataTrigger>
</Style.Triggers>

如果您想防止多余的设置器,您可以创建一个 布尔 OR 多值转换器。

public class BooleanOrConverter : IMultiValueConverter
{
   public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
   {
      return values.Cast<bool>().Any(value => value);
   }

   public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
   {
      throw new InvalidOperationException();
   }
}

然后您可以使用DataTriggerMultiBinding 来实现相同的效果。

<TextBox x:Name="AdrMac_TxtBox">
   <TextBox.Resources>
      <local:BooleanOrConverter x:Key="BooleanOrConverter"/>
   </TextBox.Resources>
   <TextBox.Style>
      <Style TargetType="{x:Type TextBox}">
         <!-- ...your setters. -->
         <Style.Triggers>
            <!-- ...other triggers. -->
            <DataTrigger Value="True">
               <DataTrigger.Binding>
                  <MultiBinding Converter="{StaticResource BooleanOrConverter}">
                     <Binding ElementName="None_Imprim_Rb" Path="IsChecked"/>
                     <Binding ElementName="Sav_Rb_Checked" Path="IsChecked"/>
                     <Binding ElementName="HC_Rb_Checked" Path="IsChecked"/>
                  </MultiBinding>
               </DataTrigger.Binding>
               <Setter Property="Text" Value="{x:Static sys:String.Empty}"/>
            </DataTrigger>
         </Style.Triggers>
      </Style>
   </TextBox.Style>
</TextBox>

【讨论】:

  • 当我运行应用程序时,这段代码返回一个无效的转换错误:“return values.Cast().Any(value => value);”
  • @JeanFrançoisColombet 其中一个值可能是DependencyProperty.UnsetValue。当属性系统无法确定绑定值时设置该值,例如您引用的控件不存在。看到这个related question。如果你没有解决这个问题,你可以让转换器忽略它们:return values.All(value =&gt; value != DependencyProperty.UnsetValue) &amp;&amp; values.Cast&lt;bool&gt;().Any(value =&gt; value);。但请务必检查问题。
【解决方案2】:

Here's a simple example of a TextBox with two triggers, when either radio is selected it'll clear the TextBox text, please note the multiple &lt;DataTrigger&gt;:

<TextBox Height="23" Width="120">
    <TextBox.Style>
        <Style TargetType="{x:Type TextBox}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsChecked, ElementName=rb_One}" Value="True">
                    <Setter Property="Text" Value="{x:Null}"></Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding IsChecked, ElementName=rb_Two}" Value="True">
                    <Setter Property="Text" Value="{x:Null}"></Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>
<RadioButton x:Name="rb_One" Content="RadioButton" />
<RadioButton x:Name="rb_Two" Content="RadioButton" />

【讨论】:

    猜你喜欢
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    相关资源
    最近更新 更多