Handycontrol元件庫的Bug

孤沉發表於2024-06-13

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

相關文章