XAML中的DependencyProperty.Register文本框

时间:2011-12-22 18:00:14

标签: c# .net wpf silverlight xaml

我正在尝试使用文本框来显示加密数据,并在加密后将所有更改保存回文档。这就是我所拥有的:

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。我做得不对劲?

3 个答案:

答案 0 :(得分:1)

dependency properties的“CLR-wrappers”只能通过代码调用。 XAML解析器用于直接调用DependencyObject.GetValueDependencyObject.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是公共(非私人财产)。