如何实现点击ToggleButton修改PasswordBox的MaxLength属性
问题根因
你直接将ToggleButton.IsChecked的布尔类型值绑定到PasswordBox.MaxLength整数属性上,WPF默认类型转换规则会把布尔值true转为整数1、false转为整数0,因此切换开关时,PasswordBox的最大输入长度只会在0和1之间跳转,选中时固定为1,完全不符合预期。
修复方案
可根据代码习惯二选一:
方案1:值转换器方案(灵活支持自定义长度配置)
适合两种状态需要配置任意不同长度的场景,比如Token模式限制6位、普通密码模式限制32位。
首先编写通用的布尔转长度转换器:
using System; using System.Globalization; using System.Windows.Data; public class BoolToMaxLengthConverter : IValueConverter { public int CheckedLength { get; set; } = 6; public int UncheckedLength { get; set; } = 32; public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return value is bool isChecked && isChecked ? CheckedLength : UncheckedLength; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotSupportedException(); } }
在XAML资源中注册转换器后,修改PasswordBox的绑定即可:
<Window.Resources> <!-- 可直接在属性上修改两种状态对应的长度值 --> <local:BoolToMaxLengthConverter x:Key="PasswordMaxLengthConverter" CheckedLength="6" UncheckedLength="32"/> </Window.Resources> <!-- PasswordBox修改后代码 --> <PasswordBox MaxLength="{Binding ElementName=toggleUseToken, Path=IsChecked, Converter={StaticResource PasswordMaxLengthConverter}, Mode=OneWay}" x:Name="textboxPassword" BorderThickness="0" ToolTip="Enter your password" Password="password" Style="{StaticResource textboxpassword}" Grid.Column="1"/> <!-- ToggleButton代码无需修改 --> <ToggleButton x:Name="toggleUseToken" Grid.Column="3" ToolTip="Remember Me" Style="{StaticResource toggleToken}" Height="20"/>
方案2:样式触发器方案(无需编写后台C#代码)
如果不想额外加转换器类,可以直接通过样式触发器监听ToggleButton状态,直接给MaxLength赋值,适合长度值固定的场景:
<PasswordBox x:Name="textboxPassword" BorderThickness="0" ToolTip="Enter your password" Password="password" Grid.Column="1"> <PasswordBox.Style> <!-- 基于原有样式扩展,不会覆盖已经写好的textboxpassword样式配置 --> <Style TargetType="PasswordBox" BasedOn="{StaticResource textboxpassword}"> <!-- 默认未选中状态下的最大长度 --> <Setter Property="MaxLength" Value="32"/> <Style.Triggers> <DataTrigger Binding="{Binding ElementName=toggleUseToken, Path=IsChecked}" Value="True"> <!-- 选中ToggleButton时的最大长度 --> <Setter Property="MaxLength" Value="6"/> </DataTrigger> </Style.Triggers> </Style> </PasswordBox.Style> </PasswordBox> <!-- ToggleButton代码无需修改 --> <ToggleButton x:Name="toggleUseToken" Grid.Column="3" ToolTip="Remember Me" Style="{StaticResource toggleToken}" Height="20"/>
注意:代码里的6、32两个长度值为示例值,可替换为业务实际需要的长度。
内容的提问来源于stack exchange,提问作者cookiemonster
相关产品推荐
相关产品推荐

