如果两个文本框中的任何一个为空,则禁用按钮
本文关键字:按钮 任何一 两个 文本 如果 | 更新日期: 2023-09-27 18:18:52
有两个文本框和一个按钮。如果其中一个方框为空或空白,则应该禁用该按钮。
<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>
转换器得到适当的调用,但我不知道如何将结果设置为Condition
的Value
。
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();
}
}
实际上你需要使用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" />
如果你有一个TextBox
:
IsEnabled
属性<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>
没有转换器也可以使用:
<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>
您的转换器返回一个布尔值,因此您必须将您的值设置为True。
但是我会稍微改变一下我的转换器:而不是:
return (int)value == 0 ? false:true;
我会这样做:
return ((int)value) !=0;