2

私は現在Silverlight4を使用しており、MVVMパターンに従っています。次のように、ログインボックスをViewModelにバインドしています。

<PasswordBox Password="{Binding Path=Password, Mode=TwoWay}" />

その後、ViewModelのPropertyChangedイベントをリッスンするコマンドにバインドされたボタンがあり、データバインディングの1つでデータが更新されると、ログインボタンを有効にするのに十分なデータがあるかどうかがチェックされます。

ただし、PropertyChangedイベントは、ユーザーがいずれかのコントロールからフォーカスを変更した場合にのみ発生します。ログインボタンができるだけ早く有効になるように、キーストロークごとにモデルを更新する必要があります。

4

2 に答える 2

5

ビヘイビアを作成します。

public class UpdateSourceOnPasswordChanged : Behavior<PasswordBox>
{
    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.PasswordChanged += OnPasswordChanged;
    }

    private void OnPasswordChanged(object sender, RoutedEventArgs e)
    {
        var binding = AssociatedObject.GetBindingExpression(PasswordBox.PasswordProperty);
        binding.UpdateSource();
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();

        AssociatedObject.PasswordChanged -= OnPasswordChanged;
    }
}

そして、xamlを変更します。

<PasswordBox Password="{Binding Password, Mode=TwoWay}">
    <i:Interaction.Behaviors>
        <local:UpdateSourceOnPasswordChanged/>
    </i:Interaction.Behaviors>
</PasswordBox>

これで、プロパティPasswordがユーザータイプとして更新されます。

于 2010-02-18T00:55:03.650 に答える
0

PasswordBoxのOnKeyDownイベントをリッスンし、そこからViewModelのイベントを発生させる(またはPropertyChangedイベントにアタッチしたい他のカスタムコードを実行する)動作を使用することをお勧めします。TextBoxとその派生物(PasswordBoxなど)のデータバインディングは、フォーカスが失われるまで更新されないため、バインディングを手動で更新する必要があります。

于 2010-02-18T00:32:38.790 に答える