C# 如果两个文本框中的任何一个为空,则禁用按钮

C# 如果两个文本框中的任何一个为空,则禁用按钮,c#,wpf,xaml,C#,Wpf,Xaml,我有两个文本框和一个按钮。如果任一框为空或空白,则应禁用该按钮 <TextBox Name="firstNameTxtBox" /> <TextBox Name="lastNameTxtBox" /> <Button Content="Save" Command="{Binding Save}" Style="{StaticResource saveButtonEnabler}" /> 转换器被适当地调用,但我不知道如何将结果设置为条件的值 public

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

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

<Button Content="Save" Command="{Binding Save}"  Style="{StaticResource saveButtonEnabler}" />
转换器被适当地调用,但我不知道如何将结果设置为
条件的

public class IsButtonEnabledConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (int)value == 0 ? false : true;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

如果您有一个
文本框,则可以使用按钮的
IsEnabled
属性:

<Button Content="Save" Command="{Binding Save}" 
        IsEnabled="{Binding ElementName=firstNameTxtBox, Path=Text.Length, Mode=OneWay}" />
您的完整代码为:

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

转换器返回的是布尔值,因此必须将值设置为True

但我会稍微改变一下我的转换器: 而不是:

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

return ((int)value) !=0;

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

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

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

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


是的,这很有效。但是,我需要检查firstNameTxtBox和lastNameTxtBox的内容。@Mefhisto1您可以将您的MultiDataTrigger与此答案结合使用。这种情况是“如果两个文本框都是空的”,OP想要“如果其中一个文本框都是空的”@gts13您可以使用OP的代码,但将Value=“0”更改为Value=“True”his current“和”实现不是问题,因为他将设置IsEnabled=true,这与您使用IsEnabled=false时所做的相同是的,如果OP想要使用valueconverter,他可以使用AND,但是不使用valueconverter和使用或某种触发器设置更容易。您的
Value=“???”
应该是
Value=“true”
因为如果两个文本框都包含字符串aka
Text.Length>0
您希望启用按钮
<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>
<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" />