gpt4 book ai didi

wpf - 密码框绑定(bind)

转载 作者:行者123 更新时间:2023-12-04 02:35:42 25 4
gpt4 key购买 nike

我刚刚开始使用 M-V-VM 和 WPF,并且在理解一些绑定(bind)问题时遇到了问题。

我有一个登录页面,其中有 ComboBoxPasswordBox . ComboBox看起来像这样:

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

这工作得很好 - 我的值每次 SelectedItem 都会更新 ComboBox 上的更改!

在我的 ViewModel 中,我有一个 ICommand它使用此方法来确定登录按钮是否处于事件状态:
public bool CanLogin()
{
return !string.IsNullOrEmpty(Username) && !string.IsNullOrEmpty(Password);
}

所以我的问题是我没有 PasswordBox绑定(bind)到 ViewModel 上的 Password 属性 - 所以我无法判断它何时更新。

那么如何获得 PasswordBox 的值?到我的 View 模型?我读到的所有内容都说不要绑定(bind) PasswordBox出于安全原因。我会简单地取消对 CanLogin() 的密码限制,但我需要将值传递给 AccountService。

最佳答案

有趣的。

查看此博客文章,看看它是否对您有所帮助。
http://blog.functionalfun.net/2008/06/wpf-passwordbox-and-data-binding.html

显然链接现在已经失效所以这里是原始解决方案(找到 here ):

你可以使用附加的属性来创建一个这样的助手:

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);    }}

Use it:

<PasswordBox w:PasswordHelper.Attach="True" 
w:PasswordHelper.Password="{Binding Text, ElementName=plain, Mode=TwoWay}"
Width="100"/>

关于wpf - 密码框绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/888466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com