为什么silverlight的PasswordBox控件的password属性不可以绑定?该如何实现绑定?

有人发现想Password的控件中实现如下的绑定,

ContractedBlock.gif ExpandedBlockStart.gif Code
<UserControl x:Class="SilverlightApplication9.Page"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
    Width
="400" Height="300" xmlns:o="clr-namespace:SilverlightApplication9">
    
<UserControl.Resources>
        
<o:MainController x:Name="mainController" />
    
</UserControl.Resources>
    
<StackPanel x:Name="LayoutRoot" Background="White">
        
<PasswordBox Password="{Binding Path=Password, Source={StaticResource mainController}}" />
        
<TextBox Text="{Binding Path=Password, Source={StaticResource mainController}, Mode=TwoWay}" />
    
</StackPanel>
</UserControl>

后代代码:

 

 

ContractedBlock.gif ExpandedBlockStart.gif Code
public class MainController: INotifyPropertyChanged
{
    
private string password;
    
public string Password
    {
        
get { return password; }
        
set
        {
            
if (password != value)
            {
                password 
= value;
                
if (PropertyChanged != null)
                    PropertyChanged(
thisnew PropertyChangedEventArgs("Password"));
            }
        }
    }

    
public event PropertyChangedEventHandler PropertyChanged;

}

却总是报错。

原因是PasswordBox的password属性并没有相应的DependencyProperty(依赖属性),所以就不可以实现绑定。

但是你可以暴露出来一个依赖属性,在内存中存储PasswordBox的文本,PasswordBox 可以对他的文本进行加密并且只在调用密码CLR属性时生成普通的文本。

如下所示:

1. 定义一个PasswordBoxHelper 类,并注册一个依赖属性PasswordBind

ContractedBlock.gif ExpandedBlockStart.gif Code
public class PasswordBoxHelper
{
    
private static readonly DependencyProperty passwordBindProperty =
        DependencyProperty.RegisterAttached(
"PasswordBind"typeof(string), typeof(PasswordBoxHelper),
            
new PropertyMetadata(PropertyChangedHandler));

    
private static void PropertyChangedHandler(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        PasswordBox passBox 
= (PasswordBox)sender;
        passBox.Password 
= (string)e.NewValue;
    }
}

 2. 你就可以绑定到你的PasswordBox 控件上在xaml代码中:

< PasswordBox  o:PasswordHelper.PasswordBind =" {Binding Path=Password, Source={StaticResource mainController}} "   />

由于使用的绑定方式是OneWay, 所以PasswordBox的Password属性的值只会随着数据源而改变,当用户输入密码时并不能改变数据源绑定的值,因为用户输入的值只是关联到Password的password属性,而不是附加的属性passwordbind。

如果要检查用户的输入,需要使用PasswordBox的事件PasswordChanged。

参考链接:http://www.silverlightissues.com/issue.php5?i=68

 

转载于:https://www.cnblogs.com/Amanda2007/archive/2009/04/13/1434797.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值