我正在尝试使用文本框来显示加密数据,并在加密后将所有更改保存回文档。这就是我所拥有的:
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。我做得不对劲?
答案 0 :(得分:1)
dependency properties的“CLR-wrappers”只能通过代码调用。 XAML解析器用于直接调用DependencyObject.GetValue和DependencyObject.SetValue方法。
要完成任务,您可以使用ValueConverter扩展绑定。
答案 1 :(得分:0)
查看debugging databindings,如果绑定被破坏,您至少应该能够检索绑定错误。
有各种可能的原因,其中之一是DataContext
不是属性的控件。断点没有被击中的事实没有任何意义,CLR属性只是为了您的方便(你应该不在其中放置任何自定义代码),如果你不在你的代码中使用它,没有人会,绑定系统使用SetBinding
之类的东西。
答案 2 :(得分:0)
属性字符串UDI未被调用,因为它是私有的。要使XAML具有访问权限,您需要将其公开。您需要将datacontext设置为后面的代码。
DependencyProperty可能存在问题但是如果在UID上没有调用get和set,那么它就没那么久了。首先尝试不加密,至少得到绑定调试。
<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是公共(非私人财产)。