如果两个TextBox中的任何一个为空,请禁用按钮

时间:2015-10-22 11:37:34

标签: c# wpf xaml

我有两个文本框和一个按钮。如果其中任何一个框为空或空格,则应禁用该按钮。

<TextBox Name="firstNameTxtBox" />
<TextBox Name="lastNameTxtBox" />

<Button Content="Save" Command="{Binding Save}"  Style="{StaticResource saveButtonEnabler}" />

saveButtonEnabler资源:

<UserControl.Resources>
    <converters:IsButtonEnabledConverter x:Key="isButtonEnabledConverter" />
        <Style x:Key="saveButtonEnabler" TargetType="Button">
            <Setter Property="IsEnabled" Value="False"/>
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding ElementName=firstNameTxtBox, Path=Text.Length, Converter={StaticResource isButtonEnabledConverter}}" Value="???" />
                        <Condition Binding="{Binding ElementName=lastNameTxtBox, Path=Text.Length, Converter={StaticResource isButtonEnabledConverter}}" Value="???" />
                    </MultiDataTrigger.Conditions>
                    <Setter Property="IsEnabled" Value="True"/>
                </MultiDataTrigger>
            </Style.Triggers>
        </Style>
</UserControl.Resources>

适当调用转换器,但我不知道如何将结果设置为Value的{​​{1}}。

Condition

4 个答案:

答案 0 :(得分:8)

实际上你需要使用2个触发器将IsEnabled设置为false。您当前的实现是AND,您想要的是OR。

<TextBox x:Name="firstNameTxtBox"/>
<TextBox x:Name="lastNameTxtBox"/>
<Button Content="Save">
  <Button.Style>
     <Style TargetType="{x:Type Button}">
         <Style.Triggers>
             <DataTrigger Binding="{Binding Text.Length, ElementName=firstNameTxtBox, UpdateSourceTrigger=PropertyChanged}" Value="0">
                 <Setter Property="IsEnabled" Value="False"/>
             </DataTrigger>
             <DataTrigger Binding="{Binding Text.Length, ElementName=lastNameTxtBox, UpdateSourceTrigger=PropertyChanged}" Value="0">
                 <Setter Property="IsEnabled" Value="False"/>
             </DataTrigger>
         </Style.Triggers>
     </Style>
  </Button.Style>
</Button>

如果你想使用valueconverter方法,你需要做的就是在触发器绑定中使用'True'作为值

<Condition Binding="{Binding ElementName=firstNameTxtBox, Path=Text.Length, Converter={StaticResource isButtonEnabledConverter}}" Value="True" />
<Condition Binding="{Binding ElementName=lastNameTxtBox, Path=Text.Length, Converter={StaticResource isButtonEnabledConverter}}" Value="True" />

答案 1 :(得分:4)

如果您有一个IsEnabled

,则可以使用该按钮的TextBox属性
<Button Content="Save" Command="{Binding Save}" 
        IsEnabled="{Binding ElementName=firstNameTxtBox, Path=Text.Length, Mode=OneWay}" />

同时为TextBoxes试试这个(你不需要使用转换器):

<MultiDataTrigger.Conditions>
    <Condition Binding="{Binding ElementName=firstNameTxtBox, Path=Text.Length, Mode=OneWay}" Value="0"/>
    <Condition Binding="{Binding ElementName=lastNameTxtBox, Path=Text.Length, Mode=OneWay}" Value="0"/>
</MultiDataTrigger.Conditions>

您的完整代码将是:

<TextBox Name="firstNameTxtBox" />
<TextBox Name="lastNameTxtBox" />

<Button Content="Save" Command="{Binding Save}" >
      <Button.Style>
          <Style TargetType="{x:Type Button}">
              <Style.Triggers>
                  <MultiDataTrigger>
                      <MultiDataTrigger.Conditions>
                         <Condition Binding="{Binding ElementName=firstNameTxtBox, Path=Text.Length, Mode=OneWay}" Value="0"/>
                         <Condition Binding="{Binding ElementName=lastNameTxtBox, Path=Text.Length, Mode=OneWay}" Value="0"/>
                      </MultiDataTrigger.Conditions>
                      <Setter Property="IsEnabled" Value="False"/>
                 </MultiDataTrigger>
             </Style.Triggers>
          </Style>
      </Button.Style>
</Button>

答案 2 :(得分:1)

这将在没有转换器的情况下工作:

    <TextBox x:Name="Foo1"/>
    <TextBox x:Name="Foo2"/>
    <Button Content="Push me">
        <Button.Style>
            <Style TargetType="{x:Type Button}">
                <Style.Triggers>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding Text.Length, ElementName=Foo1, UpdateSourceTrigger=PropertyChanged}" Value="0"/>
                            <Condition Binding="{Binding Text.Length, ElementName=Foo2, UpdateSourceTrigger=PropertyChanged}" Value="0"/>
                        </MultiDataTrigger.Conditions>
                        <Setter Property="IsEnabled" Value="False"/>
                    </MultiDataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>

答案 3 :(得分:0)

您的转换器返回一个布尔值,因此您必须将值设置为True。

但是我会改变我的转换器: 而不是:

public static <T> T[] tail(T[] array) {
    if (array.length == 0)
        throw new IllegalArgumentException("Array cannot be empty");

    return java.util.Arrays.copyOfRange(array, 1, array.length);
}

我愿意:

return (int)value == 0 ? false:true;