我的WPF程序使用了Handycontrol组件库,前端写了
<Button
Width="100"
Height="30"
Margin="40,20,20,-100"
HorizontalAlignment="Center"
Background="#FF0078D7"
Command="{Binding LoginCommand}"
CommandParameter="{Binding Password}"
Content="登录"
IsDefault="True" />
<hc:PasswordBox
x:Name="txtPassword"
Width="250"
Margin="10,0"
hc:InfoElement.Placeholder="请输入密码"
pwdBehavior:PasswordBoxProvider.Attach="True"
pwdBehavior:PasswordBoxProvider.Password="{Binding Password, Mode=TwoWay}"
CaretBrush="#FFD94448"
FontSize="16"
SelectionBrush="#FFD94448"
ShowEyeButton="True" />
1、因为不管是原生的WPF还是Handycontrol组件库,里面的密码框的Password属性都是普通属性,不是依赖属性,不能进行绑定,所以我必须自己写一个依赖属性,如,我上面写的
pwdBehavior:PasswordBoxProvider.Password="{Binding Password, Mode=TwoWay}"
我可以显示的在后台ViewModel代码中绑定它,
private string _password;
public string Password
{
get => _password;
set => SetProperty(ref _password, value);
}
然后去写构造函数去写
Password = "123456";
那么启动程序界面上密码框显示123456,这是没问题的,
并且我登录的参数也绑定了Password,也没问题也能传递过来值,
现在假如我登录的参数不直接绑定后台ViewModel的Password,
CommandParameter="{Binding ElementName=txtPassword,Path=(pwdBehavior:PasswordBoxProvider.Password)}"
只要构造器的 Password = "123456";存在,那么我这两种写法都是没问题的,
但是假如我的构造器不去主动的写 Password = "123456";那么启动程序后界面密码框是空的,需要我去输入,我不管输入多少,这个密码框走的是密码框的普通属性Password,而不是
pwdBehavior:PasswordBoxProvider.Password="{Binding Password, Mode=TwoWay}"
因为自从我写了 pwdBehavior:PasswordBoxProvider.Password="{Binding Password, Mode=TwoWay}"后,实际上密码框存在两个Password属性,一个是pwdBehavior:PasswordBoxProvider.Password依赖属性,一个是Password普通属性,
而如果我在后台的构造器不去显示的指定绑定,那么前端输入的会是走的Password的线路,而不去走pwdBehavior:PasswordBoxProvider.Password,至此绑定失效,传参失效,
而为了测试我登录按钮绑定是否有问题我写了
CommandParameter="{Binding ElementName=txtUsername,Path=Text}"
CommandParameter="{Binding ElementName=txtPassword,Path=Password}"
去做不同的测试,结果 CommandParameter="{Binding ElementName=txtPassword,Path=Password}"不起作用, CommandParameter="{Binding ElementName=txtUsername,Path=Text}"起作用,
说明问题出在控件本身上,是Handycontrol在Password和 pwdBehavior:PasswordBoxProvider.Password之间不知道该如何选择,所以两者都没选,是为null