Pro*_*hor 3 c# wpf behavior mvvm
我写了WPF MVVM Prism 6.2应用程序.在登录窗口(即PrismUserControl)的视图中,我在视图模型中将PaswordBox绑定(通过行为)到"密码"属性.每次在应用程序运行时调用登录窗口时,PasswordBox必须为空. (例如,在用户关闭当前会话之后,他或她必须只看到Shell上方的空Shell和登录窗口.)我的问题是上面的 PasswordBox仅在应用程序加载后第一次显示为空.如果PaswordBox在第二次或第三次显示等,则它不为空.请看下面的图片:
如您所见,密码不为空,但在这种情况下它必须为空.以下是来自登录窗口标记的XAML片段,其中PaswordBox为:
. . . . . . . . . . . . . .
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
. . . . . . . . . . . . . .
<PasswordBox Grid.Row="1" Grid.Column="1" Height="30" Margin="0 10 5 0" AutomationProperties.AutomationId="UserPasswordBox">
<i:Interaction.Behaviors>
<behavior:PasswordBoxBindingBehavior Password="{Binding Password}"/>
</i:Interaction.Behaviors>
</PasswordBox>
. . . . . . . . . . . . . . . .
Run Code Online (Sandbox Code Playgroud)
下面是XAML中涉及的行为类,如上所示:
public class PasswordBoxBindingBehavior : Behavior<PasswordBox>
{
protected override void OnAttached()
{
AssociatedObject.PasswordChanged += OnPasswordBoxValueChanged;
}
public SecureString Password
{
get { return (SecureString)GetValue(PasswordProperty); }
set { SetValue(PasswordProperty, value); }
}
public static readonly DependencyProperty PasswordProperty =
DependencyProperty.Register("Password", typeof(SecureString), typeof(PasswordBoxBindingBehavior), new PropertyMetadata(null));
private void OnPasswordBoxValueChanged(object sender, RoutedEventArgs e)
{
var binding = BindingOperations.GetBindingExpression(this, PasswordProperty);
if (binding != null)
{
PropertyInfo property = binding.DataItem.GetType().GetProperty(binding.ParentBinding.Path.Path);
if (property != null)
property.SetValue(binding.DataItem, AssociatedObject.SecurePassword, null);
}
}
}
Run Code Online (Sandbox Code Playgroud)
以下是视图模型中的"密码"属性.PasswordBox通过PasswordBoxBindingBehavior绑定到此属性:
public SecureString Password
{
get { return this._password; }
set { this.SetProperty(ref this._password, value); }
}
Run Code Online (Sandbox Code Playgroud)
每次在应用程序工作期间显示登录窗口时,我都需要将PasswordBox清空.我试图在视图模型中以编程方式清除"密码"属性,但它没有帮助.我该怎么做?请帮忙.
你可以连接一台PropertyChangedCallback的Password那台自己的行为的依赖项属性Password的财产PasswordBox当为空字符串Password视图模型的来源属性设置为null:
public class PasswordBoxBindingBehavior : Behavior<PasswordBox>
{
protected override void OnAttached()
{
AssociatedObject.PasswordChanged += OnPasswordBoxValueChanged;
}
public SecureString Password
{
get { return (SecureString)GetValue(PasswordProperty); }
set { SetValue(PasswordProperty, value); }
}
public static readonly DependencyProperty PasswordProperty =
DependencyProperty.Register("Password", typeof(SecureString), typeof(PasswordBoxBindingBehavior), new PropertyMetadata(OnSourcePropertyChanged));
private static void OnSourcePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if(e.NewValue == null)
{
PasswordBoxBindingBehavior behavior = d as PasswordBoxBindingBehavior;
behavior.AssociatedObject.PasswordChanged -= OnPasswordBoxValueChanged;
behavior.AssociatedObject.Password = string.Empty;
behavior.AssociatedObject.PasswordChanged += OnPasswordBoxValueChanged;
}
}
private static void OnPasswordBoxValueChanged(object sender, RoutedEventArgs e)
{
PasswordBox passwordBox = sender as PasswordBox;
var behavior = Interaction.GetBehaviors(passwordBox).OfType<PasswordBoxBindingBehavior>().FirstOrDefault();
if(behavior != null)
{
var binding = BindingOperations.GetBindingExpression(behavior, PasswordProperty);
if (binding != null)
{
PropertyInfo property = binding.DataItem.GetType().GetProperty(binding.ParentBinding.Path.Path);
if (property != null)
property.SetValue(binding.DataItem, passwordBox.SecurePassword, null);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以PasswordBox通过Password在视图模型中将source属性设置为null 来清除它.
| 归档时间: |
|
| 查看次数: |
2765 次 |
| 最近记录: |