C# 奇怪的WPF错误

C# 奇怪的WPF错误,c#,.net,wpf,xaml,blend,C#,.net,Wpf,Xaml,Blend,我有一些间歇性工作的代码,我不明白为什么(直到今天早上windows自动安装了一些更新,但没有一个与我的项目中使用的.NET4版本相关) 我的密码框 <PasswordBox x:Name="TboxPassword" Grid.Row="1" Grid.Column="0" controls:TextboxHelper.Watermark="Password ..." controls:TextboxHelper.Clea

我有一些间歇性工作的代码,我不明白为什么(直到今天早上windows自动安装了一些更新,但没有一个与我的项目中使用的.NET4版本相关)

我的密码框

<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>
调试器在标记交互处停止。行为

请记住,直到今天我才收到这个错误。现在我收到它,即使我恢复了我今天所做的一切

请告知D

PS:我刚刚注释掉了行为内部的所有代码。还删除了密码绑定。仍然不起作用:(


PPS:如果我关闭Visual Studio(2012),删除我的bin文件夹,打开VS,打开project,全部重建,应用程序将一直运行到代码的第一次更改。

我知道这个问题已经很老了。但我会发布答案,以防有人再次遇到它

我刚刚遇到了同样的问题并找到了解决方案,我注意到您在代码中使用了行为。请确保您引用的是Blend SDK Windows的正确版本。交互性

在我的例子中,问题是我只在主WPF项目上安装了NugetPackage for Blend SDK for WPF 4.5,而忘记在使用行为的解决方案中的其他WPF项目上安装它

我通过在包含导致问题的代码的项目上安装相同的NugetPackage解决了这个问题


希望这对您有所帮助!

发布此行为的代码可能对其他人有所帮助我会冒险猜测PasswordBoxBehavior构造函数中的某些内容在运行时引发异常。正如您所说,不确定为什么会在今天而不是昨天发生。您能发布更多代码吗?无构造函数重写…@User123456789该集合由Microsoft定义。为了添加到该集合中,我所做的只是将我的行为放在I:Interaction.Behaviors部分中。纯粹出于兴趣的问题-此行为技术是否可以防止窥探,如中所示?(我猜不是,因为密码现在是一个依赖属性,但我还是很想知道。)
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
}
{"Cannot add instance of type 'PasswordBoxBehavior' to a collection of type 'BehaviorCollection'. Only items of type 'T' are allowed."}