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