如何将自定义静态对象绑定到 Null

How to bind a custom static object to Null

我有以下 class:

public class UserInformation : IDataErrorInfo
{
    public string Name { get; set; }
    public string Surname { get; set; }
    public string Identifier { get; set; }
    public string Email { get; set; }

    private const string matchEmailPattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$";

    public override string  ToString()
    {
        return Name + " " + Surname;
    }

    public string this[string columnName]
    {
        get
        {
            if (columnName == null) return string.Empty;
            string result = string.Empty;

            switch (columnName)
            {
                case "Name":
                    if (string.IsNullOrEmpty(Name))
                        result = "Name cannot be empty.";
                    break;
                case "Surname":
                    if (string.IsNullOrEmpty(Surname))
                        result = "Surname cannot be empty.";
                    break;
                case "Identifier":
                    if (string.IsNullOrEmpty(Identifier))
                        result = "Identifier cannot be empty.";
                        break;
                case "Email":
                    if (string.IsNullOrEmpty(Email))
                        result = "Email cannot be empty.";
                    else
                    {

                        if (!Regex.IsMatch(Email, matchEmailPattern))
                            result = "Email format is invalid.";
                    }
                    break;
            }
            return result;
        }
    }

    public string Error { get; private set; }
}

请注意,这是对 WPF 文本框的验证 class。在我的 Resources 中,我将其声明为静态资源:

<custompackage:UserInformation x:Key="UserInformation" />

我用它来验证一些 TextBox。那很好用。但是每当我想使用这个属性两次时,它包含了我第一次使用静态资源绑定时引入的值。

如何以编程方式清空此静态资源对象(我的意思是,当我决定这样做时),以便确保下次使用它时它为空?

您可以从 MarkupExtension 中得出:

public class UserInformation : MarkupExtension, IDataErrorInfo
{
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
// the rest of your Class
}

然后你不需要将它声明为静态资源你可以像标记一样简单地使用它而不是你写的{StaticResource xxx} {UserInformation}并且因为它是一个MarkupExtension它将实例化一个class 和 return 它,解决你的问题,因为它每次使用都是一个新实例。

如果您不希望资源在其使用过程中共享,请将资源的 x:Shared 设置为 false。这将确保您将根据其使用情况获得新的资源实例。

<custompackage:UserInformation x:Key="UserInformation"
                               x:Shared="false" />