public void SetPassword(string password)
{
try
{
_suppressPasswordChanged = true;
PasswordText.Password = password;
}
finally
{
_suppressPasswordChanged = false;
}
}
PasswordBox
結合データがないので、その場合ボックスにユーザーがビューモデルを更新するためにビューのコードを必要とします。私はもともと、このイベントハンドラを持っていた:
private void PasswordTextOnPasswordChanged(object sender, RoutedEventArgs e)
{
((LoginFormViewModel)DataContext).Password = PasswordText.SecurePassword;
}
は、それから私は、ビューモデルにPassword
プロパティを設定できるようにしたかった、とこのビューのメソッドを追加する必要がありました:
セッターから呼び出され
public void SetPassword(string password)
{
PasswordText.Password = password;
}
:
set
{
if (value == _password) return;
_password = value;
((LoginFormPopup)View).SetPassword(_password.ToClearString());
OnPropertyChanged();
}
それは時に再帰的にトン通常べきではなく、これは、再びセッターと呼ばれるPasswordTextOnPasswordChanged
を、トリガSetPassword
になってしまいましたコードによって喚起された。
private bool suppressPasswordChanged;
private void PasswordTextOnPasswordChanged(object sender, RoutedEventArgs e)
{
if (!suppressPasswordChanged)
{
((LoginFormViewModel)DataContext).Password = PasswordText.SecurePassword;
}
}
public void SetPassword(string password)
{
try
{
suppressPasswordChanged = true;
PasswordText.Password = password;
}
finally
{
suppressPasswordChanged = false;
}
}
しかしSetPassword
は常にそのfinally
でsuppressPasswordChanged
をリセットするので、それはまだ常にPasswordTextOnPasswordChanged
から呼び出さなるだろう:お互いを呼び出し、これらのメソッドの予防に私の最初のと恥ずかしいの試みでした。
私の、現在の作業が、わずか臭い、解決策は、イベントハンドラに「-呼び出すことはありません」フラグを設定する責任を動かすことであるかもしれない:今
private bool _textChangedEventBusy;
private void PasswordTextOnPasswordChanged(object sender, RoutedEventArgs e)
{
try
{
_textChangedEventBusy = true;
((LoginFormViewModel)DataContext).Password = PasswordText.SecurePassword;
}
finally
{
_textChangedEventBusy = false;
}
}
public void SetPassword(string password)
{
if (!_textChangedEventBusy)
{
PasswordText.Password = password;
}
}
、SetPassword
がしか呼ばれていますビューモデルのセッターから取得し、キャレットをテキストの先頭に設定するのが理想的です。
2 Qs:1)PasswordTextOnPasswordChangedの内容は何ですか? 2)このバグのある動作を確認するために、VM内で実行している可能性はありますか?先日、Parallels VM – Bijington
を実行している誰かと同じような変なタイプの問題が発生し、変更イベントが破られ、スタイルが検査されました。あなたはそれが魚のようなものかどうかを確認してください – Steve
@Profあなたはそれを有効にしたままにしているかもしれません...ちょっと考えてください – CodingYoshi