【发布时间】:2014-07-30 12:21:55
【问题描述】:
我有一些代码间歇性地工作,我不明白为什么(直到今天早上 Windows 自动安装了一些更新,但与我的项目中使用的 .NET 4 版本无关)。
我的密码箱...
<PasswordBox x:Name="TboxPassword" Grid.Row="1" Grid.Column="0"
controls:TextboxHelper.Watermark="Password ..."
controls:TextboxHelper.ClearTextButton="True"
Margin="10, 10, 0, 0">
<i:Interaction.Behaviors>
<misc:PasswordBoxBehavior Password="{Binding Path=Password, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, NotifyOnValidationError=True}"/>
</i:Interaction.Behaviors>
</PasswordBox>
我的行为:
public class PasswordBoxBehavior : Behavior<PasswordBox>
{
#region Fields
private readonly object _tryToExecuteActionSyncObject = new object();
private bool _isUpdating;
#endregion
#region Properties
public string Password
{
get { return (string)GetValue(PasswordProperty); }
set { SetValue(PasswordProperty, value); }
}
public static readonly DependencyProperty PasswordProperty =
DependencyProperty.Register("Password", typeof(string), typeof(PasswordBoxBehavior),
new PropertyMetadata(string.Empty, OnPasswordPropertyChanged));
#endregion
#region Methods
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.PasswordChanged += OnAssociatedObjectPasswordChanged;
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.PasswordChanged -= OnAssociatedObjectPasswordChanged;
}
private void OnAssociatedObjectPasswordChanged(object sender, RoutedEventArgs e)
{
TryToExecuteAction(() => Password = AssociatedObject == null
? string.Empty
: AssociatedObject.Password);
}
private static void OnPasswordPropertyChanged
(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
PasswordBoxBehavior passwordBoxBehavior;
if (sender == null
|| (passwordBoxBehavior = sender as PasswordBoxBehavior) == null
|| passwordBoxBehavior.AssociatedObject == null)
{
return;
}
passwordBoxBehavior.TryToExecuteAction
(() => passwordBoxBehavior.AssociatedObject.Password =
(e.NewValue == null
? string.Empty
: (string) e.NewValue));
}
private void TryToExecuteAction(Action actionToExecute)
{
bool continueExecution;
lock (_tryToExecuteActionSyncObject)
{
continueExecution = _isUpdating == false;
_isUpdating = true;
}
if (continueExecution == false)
{
return;
}
try
{
if (actionToExecute != null)
{
actionToExecute();
}
}
finally
{
lock (_tryToExecuteActionSyncObject)
{
_isUpdating = false;
}
}
}
#endregion
}
我得到 0(零)个编译错误。运行应用程序时,90% 的时间我都会收到运行时异常,说明:
{"Cannot add instance of type 'PasswordBoxBehavior' to a collection of type 'BehaviorCollection'. Only items of type 'T' are allowed."}
调试器停在标签 Interaction.Behaviors
请记住,直到今天我才收到此错误。现在,即使我恢复了今天所做的一切,我也会收到它。
请指教.. :D
PS:我刚刚注释掉了行为内部的所有代码。还删除了密码绑定。还是不行:(
PPS:如果我关闭 Visual Studio (2012),删除我的 bin 文件夹,打开 VS,打开项目,重新构建所有应用程序WORKS,直到第一次更改代码。
【问题讨论】:
-
为这种行为发布代码可能会帮助其他人帮助您
-
我会冒险猜测您的 PasswordBoxBehavior 构造函数中的某些东西在运行时运行时会引发异常。就像你说的,不知道为什么会在今天而不是昨天发生。能多发一点代码吗?
-
无构造函数覆盖 ...
-
@User123456789 该集合由 Microsoft 定义。为了添加到该集合中,我所做的就是将我的行为放在 i:Interaction.Behaviors 部分中。
-
只是一个纯粹出于兴趣的问题 - 这种行为技术是否可以防止窥探,如this article? (我猜不是,因为 Password 现在是一个依赖属性,但我很想知道。)