首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用INotifyDataErrorInfo验证依赖项属性

使用INotifyDataErrorInfo验证依赖项属性
EN

Stack Overflow用户
提问于 2015-10-23 01:52:39
回答 1查看 402关注 0票数 1

我有一个用户控件,在网格中只有一个Textbox,如下所示:

代码语言:javascript
复制
<TextBox Text="{Binding Username}"></TextBox>

用户控件的代码隐藏实现了INotifyDataErrorInfoINotifyPropertyChanged。这是我的代码隐藏的样子(除了上面提到的接口实现)

代码语言:javascript
复制
public TestControl()
{
    InitializeComponent();
    this.DataContext = this;
}

private string _username;
public string Username
{
    get { return _username; }
    set
    {
        _username = value;
        if (_username.Length < 3)
            SetErrors("Username", new List<string> { "Usernames should be at least 3 characters long" });
        OnPropertyChanged("Username");
    }
}

其中,SetErrors只是一个向IEnumerable添加错误的函数,INotifyDataErrorInfo.GetErrors将返回该错误。这工作得很好。当我输入少于3个字符的文本时,文本框变成红色。这正是我所期望的。

现在我想让MainWindow的视图模型设置这个textbox。要做到这一点,Username字段应该是一个依赖属性,以便我可以绑定到它。但问题是我现在不能验证它。我创建了一个依赖属性,并尝试在ValidateValueCallback中验证它,但INotifyDataErrorInfo成员不是静态的。所以我联系不上他们。我该怎么办?

EN

回答 1

Stack Overflow用户

发布于 2015-10-23 02:04:12

将用户名放在MainViewModel和UserControl中,使用RelativeSource绑定绑定到它,如下所示

代码语言:javascript
复制
"{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=DataContext.Username}"

您可以使用属性替换显式名称指示。

编辑

当您定义依赖属性时,您可以确定值发生更改时将引发的事件。作为一个参数,它引用了定义它的类,就你的项目而言,它就是你的UserControl。然后你可以在这个对象上调用任何方法,根本不需要是静态的。下面的代码描述了概念,而不是精确的解决方案,请根据您的需求进行调整:

代码语言:javascript
复制
   public static readonly DependencyProperty PropertyTypeProperty = DependencyProperty.Register(
        "PropertyType", typeof (propertyType), typeof (PasswordBoxDP), new PropertyMetadata((x, y) =>
        {
            var userControlClass = x as UserControlClass;
            userControlClass.Validate();
        }));

    private void Validate()
    {

    }

顺便说一句,在您的情况下,绑定将不起作用。您定义了引用自身的DataContext,因此当您在依赖属性上设置绑定时,它将在UserControl中启动查找。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33287439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档