DependencyProperty.注册文本框
本文关键字:文本 注册 DependencyProperty | 更新日期: 2023-09-27 18:18:33
我试图获得一个文本框来显示加密的数据,并在加密后将任何更改保存回文档。这是我的文件:
XAML:<TextBox Text="{Binding Path=UID, Mode=TwoWay}" Name="txtUID" Width="70"/>
背后的代码:
public DependencyProperty UIDProperty = DependencyProperty.Register("UID", typeof(string), typeof(MainWindow), new FrameworkPropertyMetadata(""));
private string UID
{
get { return Encryption.Decrypt((string)GetValue(UIDProperty)); }
set { SetValue(UIDProperty, Encryption.Encrypt(value)); }
}
问题是当表单加载,当我改变值什么都没有发生。文本框保持空白,代码不会在我为捕获UID的get和set而设置的断点处停止。我做错了什么?
依赖属性的" clr包装器"只能通过代码调用。XAML解析器通过直接调用DependencyObject来使用。GetValue和DependencyObject。SetValue方法。
要完成您的任务,您可以使用ValueConverter扩展您的绑定。
查看调试数据绑定,如果绑定被破坏,您至少应该能够检索绑定错误。
有各种可能的原因,其中之一是DataContext
不是具有该属性的控件。没有命中断点的事实没有任何意义,CLR属性只是为了你的方便(你不应该在其中放置任何自定义代码),如果你不在你的代码中使用它,没有人会使用它,绑定系统使用类似SetBinding
的东西。
属性字符串UDI没有被调用,因为它是私有的。为了使XAML具有访问权限,您需要将其设为公共。并且需要将数据上下文设置为后面的代码。
DependencyProperty可能有问题,但如果get和set没有在UID上调用,那么它就没有那么远。首先尝试不加密,至少可以调试绑定。
<TextBox Text="{Binding Path=UID, Mode=TwoWay}" Name="txtUID" Width="70"/>
背后的代码:
public DependencyProperty UIDProperty = DependencyProperty.Register("UID", typeof(string), typeof(MainWindow), new FrameworkPropertyMetadata(""));
string uid = string.empty;
public string UID
{
get
{
//return Encryption.Decrypt((string)GetValue(UIDProperty));
Debug.WriteLine("get called");
return uid;
}
set
{
// SetValue(UIDProperty, Encryption.Encrypt(value));
Debug.WriteLine("set called");
if(uid != value)
{
uid = value;
NotifyPropertyChanged("UID");
}
}
}
注意UID是一个公共属性(不是私有属性)