System.StackOverflowException这没有意义......如何调试?

Chr*_*ide 7 c#

我正在构建一个使用简单MVVM架构和EF的WPF应用程序.

我看到一个奇怪的问题,如果我尝试设置一个datetime属性,我得到一个System.StackOverflowException.如果我没有设置datetime属性,我不会得到异常.

捆绑:

   <DatePicker Style="{StaticResource Dp}" 
               Grid.Column="1" 
               SelectedDate="{Binding Date, UpdateSourceTrigger=PropertyChanged}" />
Run Code Online (Sandbox Code Playgroud)

公共财产:

public DateTime Date
{
    get
    {
        return _criticalDate.Date;
    }
    set
    {
        if (_criticalDate != null && value != null && _criticalDate.Date == value)
            return;
        _criticalDate.Date = value;
        OnPropertyChanged("Date");
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试使用调试器逐步执行它似乎不起作用.我已经看过所有试图看到发生了什么的事情......有什么迹象表明可能导致这种情况发生了什么?

这是CriticalDate班级的定义,

public partial class CriticalDate
{
    public int ID { get; set; }
    public System.DateTime Date { get; set; }
    public string CriticalReason { get; set; }
    public int FileID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

_criticalDate字段是CriticalDate该类的私有实例.CriticalDate是EF从我的数据库模式创建的类.它本身不是一个DateTime.

最终更新

我仍然不知道出了什么问题......我撕掉了有问题的部分(包括绑定)并从头开始重写.不知道我做了什么不同,但它现在有效.我认为这与物品控制的设置方式有关...如果我有更多的时间(愚蠢的截止日期),我会回去看看它是什么,但现在这是一个谜.

感谢您分享我的困惑,如果只是如此简短.

rae*_*ae1 0

尝试删除OnPropertyChanged("Date");,或将绑定模式更改为OneWayToSource

来自的文档UpdateSourceTrigger

TwoWay 或 OneWayToSource 的绑定侦听目标属性中的更改并将它们传播回源。这称为更新源。通常,只要目标属性发生更改,就会发生这些更新。这对于复选框和其他简单控件来说很好,但通常不适合文本字段。每次击键后进行更新会降低性能,并且会剥夺用户在提交新值之前退格和修复键入错误的通常机会。因此,Text 属性的默认 UpdateSourceTrigger 值为 LostFocus 而不是 PropertyChanged。

我相信OnPropertyChanged("Date");Date_set方法正在更新 UI,这又会再次调用该Date_set方法,从而完成循环并导致递归。