wpf - باسوردبوكس ملزمة




mvvm binding (2)

أنا بدأت للتو مع مف-فم و وف، وبعد أن قضايا فهم بعض القضايا الملزمة.

لدي صفحة تسجيل دخول تحتوي على ComboBox PasswordBox مرور. يبدو ComboBox هذا كما يلي:

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

هذا يعمل على ما يرام - يتم تحديث القيم بلدي في كل مرة التغييرات ComboBox على ComboBox !

في بلدي فيوموديل لدي ICommand الذي يستخدم هذه الطريقة لتحديد ما إذا كان زر تسجيل الدخول نشط:

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

لذلك مشكلتي هي أنني لم يكن لديك PasswordBox ملزمة إلى خاصية كلمة المرور على فيوموديل - لذلك ليس لدي أي وسيلة لمعرفة متى يتم تحديثه.

فكيف يمكنني الحصول على قيمة باسوردبوكس لبلدي فيوموديل؟ كل ما قرأته فقط يقول لا ربط باسوردبوكس لأسباب أمنية. وأود ببساطة خلع قيود كلمة المرور على كانلوجين () ولكن أنا بحاجة إلى قيمة لتمرير إلى أكونتسيرفيس.


لقد نشرت جيست هنا هذا هو مربع كلمة مرور قابل للربط.


مثير للإعجاب.

انظر إلى هذا بلوق وظيفة ومعرفة ما اذا كان يساعدك. http://blog.functionalfun.net/2008/06/wpf-passwordbox-and-data-binding.html

على ما يبدو الارتباط ميت الآن حتى هنا هو الحل الأصلي (وجدت هنا ):

يمكنك استخدام الخصائص المرفقة لإنشاء مساعد مثل هذا:

public static class PasswordHelper
{
    public static readonly DependencyProperty PasswordProperty =
        DependencyProperty.RegisterAttached("Password",
        typeof(string), typeof(PasswordHelper),
        new FrameworkPropertyMetadata(string.Empty, OnPasswordPropertyChanged));

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

    private static readonly DependencyProperty IsUpdatingProperty =
       DependencyProperty.RegisterAttached("IsUpdating", typeof(bool), 
       typeof(PasswordHelper));


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

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

    public static string GetPassword(DependencyObject dp)
    {
        return (string)dp.GetValue(PasswordProperty);
    }

    public static void SetPassword(DependencyObject dp, string value)
    {
        dp.SetValue(PasswordProperty, value);
    }

    private static bool GetIsUpdating(DependencyObject dp)
    {
        return (bool)dp.GetValue(IsUpdatingProperty);
    }

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

    private static void OnPasswordPropertyChanged(DependencyObject sender,
        DependencyPropertyChangedEventArgs e)
    {
        PasswordBox passwordBox = sender as PasswordBox;
        passwordBox.PasswordChanged -= PasswordChanged;

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

    private static void Attach(DependencyObject sender,
        DependencyPropertyChangedEventArgs e)
    {
        PasswordBox passwordBox = sender as PasswordBox;

        if (passwordBox == null)
            return;

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

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

    private static void PasswordChanged(object sender, RoutedEventArgs e)
    {
        PasswordBox passwordBox = sender as 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"/>






passwordbox