c# - 使用 WPF 密码绑定(bind)在类型中找不到可附加属性

标签 c# wpf xaml

我最近发现您应该在 WPF 中绑定(bind)密码。我在登录窗口找到了问题的答案,但我很难使用我的助手类来解决绑定(bind)问题:PasswordHelper。此类位于我的项目文件夹之一,名为 Utils

这是我的 XAML 代码的一部分:

<Window x:Class="IPdevices.LoginWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:IPdevices"
        xmlns:utils="clr-namespace:IPdevices.Utils;assembly=Utils"
        mc:Ignorable="d"
         Title="IPDevices" Height="451" Width="397.5" Icon="logo3_q2J_icon.ico">

注意 xmlns:utils="clr-namespace:IPdevices.Utils;assembly=Utils"

我的密码箱现在是

<PasswordBox utils:PasswordHelper.BindPassword="true"  utils:PasswordHelper.BoundPassword="{Binding Path=NetworkPassword, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

但是,这不会编译,因为它在尖叫:

“在类型‘PasswordHelper’中找不到可附加属性‘BindPassword’。”

它也在尖叫:

“命名空间‘clr-namespace;IPdevices.Uitls;assembly=Utils’中不存在名称‘PasswordHelper’”

这是这个 PasswordHelper 类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;

namespace IPdevices.Utils
{
    public static class PasswordHelper
    {
        public static readonly DependencyProperty BoundPassword =
           DependencyProperty.RegisterAttached("BoundPassword", typeof(string), typeof(PasswordHelper), new PropertyMetadata(string.Empty, OnBoundPasswordChanged));

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

        private static readonly DependencyProperty UpdatingPassword =
            DependencyProperty.RegisterAttached("UpdatingPassword", typeof(bool), typeof(PasswordHelper), new PropertyMetadata(false));

        private static void OnBoundPasswordChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            PasswordBox box = d as PasswordBox;

            // only handle this event when the property is attached to a PasswordBox
            // and when the BindPassword attached property has been set to true
            if (d == null || !GetBindPassword(d))
            {
                return;
            }

            // avoid recursive updating by ignoring the box's changed event
            box.PasswordChanged -= HandlePasswordChanged;

            string newPassword = (string)e.NewValue;

            if (!GetUpdatingPassword(box))
            {
                box.Password = newPassword;
            }

            box.PasswordChanged += HandlePasswordChanged;
        }

        private static void OnBindPasswordChanged(DependencyObject dp, DependencyPropertyChangedEventArgs e)
        {
            // when the BindPassword attached property is set on a PasswordBox,
            // start listening to its PasswordChanged event

            PasswordBox box = dp as PasswordBox;

            if (box == null)
            {
                return;
            }

            bool wasBound = (bool)(e.OldValue);
            bool needToBind = (bool)(e.NewValue);

            if (wasBound)
            {
                box.PasswordChanged -= HandlePasswordChanged;
            }

            if (needToBind)
            {
                box.PasswordChanged += HandlePasswordChanged;
            }
        }

        private static void HandlePasswordChanged(object sender, RoutedEventArgs e)
        {
            PasswordBox box = sender as PasswordBox;

            // set a flag to indicate that we're updating the password
            SetUpdatingPassword(box, true);
            // push the new password into the BoundPassword property
            SetBoundPassword(box, box.Password);
            SetUpdatingPassword(box, false);
        }

        public static void SetBindPassword(DependencyObject dp, bool value)
        {
            dp.SetValue(BindPassword, value);
        }

        public static bool GetBindPassword(DependencyObject dp)
        {
            return (bool)dp.GetValue(BindPassword);
        }

        public static string GetBoundPassword(DependencyObject dp)
        {
            return (string)dp.GetValue(BoundPassword);
        }

        public static void SetBoundPassword(DependencyObject dp, string value)
        {
            dp.SetValue(BoundPassword, value);
        }

        private static bool GetUpdatingPassword(DependencyObject dp)
        {
            return (bool)dp.GetValue(UpdatingPassword);
        }

        private static void SetUpdatingPassword(DependencyObject dp, bool value)
        {
            dp.SetValue(UpdatingPassword, value);
        }
    }
}

我尝试过清理、重建、仔细检查所有内容,但就是无法编译。有什么见解吗?

最佳答案

This class is in one of my project's folder called Utils.

如果这意味着该类与包含 XAML 的 WPF 应用程序位于同一个项目中,那么这意味着您的 xmlns 可能是错误的。

对于当前的项目应该是:

xmlns:utils="clr-namespace:IPdevices.Utils;assembly="

xmlns:utils="clr-namespace:IPdevices.Utils"

关于c# - 使用 WPF 密码绑定(bind)在类型中找不到可附加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39025841/

相关文章:

c# - 如何更改按钮上的鼠标光标?

wpf - 在 MouseOver 上更改用作按钮模板的路径的填充颜色

c# - 将超链接添加到 RadioButtonList

c# - 我可以直接从 visual studio 执行 npm 命令吗

c# - 何时调用 SignalR 集线器构造函数?

WPF WrapPanel 在 ViewBox 中的最大尺寸

wpf - RichTextBox 和 Word 的字体大小不匹配

c# - 在 WPF ListBox 中显示单个列表中的多种类型?

c# - 重定向到另一个未在路由中注册的 Controller /操作

.net - 使用 StackPanel 作为 ContentControl (WPF)