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而设置的断点处停止。我做错了什么?

DependencyProperty.注册文本框

依赖属性的" 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是一个公共属性(不是私有属性)