12

MV-VMとWPFを使い始めたばかりで、いくつかのバインディングの問題を理解するのに問題があります。

とが付いたログインページがありComboBoxますPasswordBox。このComboBoxように見えます:

<ComboBox Name="comboBox1" SelectedItem="{Binding Path=Username}">

これは問題なく機能します-私の値は!のSelectedItem変更のたびに更新されます。ComboBox

私のViewModelには、ICommandこのメソッドを使用してログインボタンがアクティブかどうかを判断するがあります。

public bool CanLogin()
{
    return !string.IsNullOrEmpty(Username) && !string.IsNullOrEmpty(Password);
}

したがって、私の問題はPasswordBox、ViewModelのPasswordプロパティにバインドされていないことです。そのため、いつ更新されたかを知る方法がありません。

PasswordBoxでは、ViewModelの値を取得するにはどうすればよいですか?私が読んだことはすべてPasswordBox、セキュリティ上の理由からバインドしないでくださいと言っています。CanLogin()のパスワード制限を解除するだけですが、AccountServiceに渡す値が必要です。

4

2 に答える 2

27

面白い。

このブログ投稿を見て、それがあなたを助けているかどうかを確認してください。 http://blog.functionalfun.net/2008/06/wpf-passwordbox-and-data-binding.html

どうやらリンクは現在死んでいるので、元の解決策は次のとおりです(ここにあります):

添付プロパティを使用して、次のようなヘルパーを作成できます。

public static class PasswordHelper
{
    public static readonly DependencyProperty PasswordProperty =
        DependencyProperty.RegisterAttached("パスワード",
        typeof(文字列)、typeof(PasswordHelper)、
        new FrameworkPropertyMetadata(string.Empty, OnPasswordPropertyChanged));

    public static readonly DependencyProperty AttachProperty =
        DependencyProperty.RegisterAttached("アタッチ",
        typeof(bool), typeof(PasswordHelper), new PropertyMetadata(false, Attach));

    プライベート静的読み取り専用 DependencyProperty IsUpdatingProperty =
       DependencyProperty.RegisterAttached("IsUpdating", typeof(bool),
       typeof(PasswordHelper));


    public static void SetAttach(DependencyObject dp, bool value)
    {
        dp.SetValue(AttachProperty, 値);
    }

    public static bool GetAttach(DependencyObject dp)
    {
        return (bool)dp.GetValue(AttachProperty);
    }

    public static string GetPassword(DependencyObject dp)
    {
        戻り値 (文字列) dp.GetValue (PasswordProperty);
    }

    public static void SetPassword(DependencyObject dp, 文字列値)
    {
        dp.SetValue(PasswordProperty, 値);
    }

    プライベート静的ブール GetIsUpdating(DependencyObject dp)
    {
        return (bool)dp.GetValue(IsUpdatingProperty);
    }

    private static void SetIsUpdating(DependencyObject dp, bool value)
    {
        dp.SetValue(IsUpdatingProperty, 値);
    }

    private static void OnPasswordPropertyChanged(DependencyObject 送信者、
        DependencyPropertyChangedEventArgs e)
    {
        PasswordBox passwordBox = PasswordBox としての送信者;
        passwordBox.PasswordChanged -= PasswordChanged;

        if (!(bool)GetIsUpdating(passwordBox))
        {
            passwordBox.Password = (文字列)e.NewValue;
        }
        passwordBox.PasswordChanged += PasswordChanged;
    }

    private static void Attach(DependencyObject 送信者、
        DependencyPropertyChangedEventArgs e)
    {
        PasswordBox passwordBox = PasswordBox としての送信者;

        if (passwordBox == null)
            戻る;

        if ((bool)e.OldValue)
        {
            passwordBox.PasswordChanged -= PasswordChanged;
        }

        if ((bool)e.NewValue)
        {
            passwordBox.PasswordChanged += PasswordChanged;
        }
    }

    private static void PasswordChanged(オブジェクト送信者, RoutedEventArgs e)
    {
        PasswordBox passwordBox = PasswordBox としての送信者;
        SetIsUpdating(passwordBox, true);
        SetPassword(passwordBox, passwordBox.Password);
        SetIsUpdating(passwordBox, false);
    }
}

これを使って:

<PasswordBox w:PasswordHelper.Attach="True" 
             w:PasswordHelper.Password="{Binding Text, ElementName=plain, Mode=TwoWay}" 
             Width="100"/>
于 2009-05-20T16:37:32.037 に答える
9

バインド可能なパスワード ボックスである GISTをここに投稿しました。

于 2010-07-09T16:16:35.693 に答える