我有一个用户控件,在网格中只有一个Textbox,如下所示:
<TextBox Text="{Binding Username}"></TextBox>用户控件的代码隐藏实现了INotifyDataErrorInfo和INotifyPropertyChanged。这是我的代码隐藏的样子(除了上面提到的接口实现)
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成员不是静态的。所以我联系不上他们。我该怎么办?
发布于 2015-10-23 02:04:12
将用户名放在MainViewModel和UserControl中,使用RelativeSource绑定绑定到它,如下所示
"{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=DataContext.Username}"您可以使用属性替换显式名称指示。
编辑
当您定义依赖属性时,您可以确定值发生更改时将引发的事件。作为一个参数,它引用了定义它的类,就你的项目而言,它就是你的UserControl。然后你可以在这个对象上调用任何方法,根本不需要是静态的。下面的代码描述了概念,而不是精确的解决方案,请根据您的需求进行调整:
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中启动查找。
https://stackoverflow.com/questions/33287439
复制相似问题