gpt4 book ai didi

c# - WPF4/C# - System.StackOverflowException 崩溃应用程序

转载 作者:行者123 更新时间:2023-12-01 18:40:11 24 4
gpt4 key购买 nike

下面您可以看到我的 .xaml.cs 代码。该应用程序打开良好。有 4 个文本框可供用户更改。当您编辑文本框中的默认值之一,然后单击“关闭”以不选择它时,应用程序会崩溃并出现 System.StackOverflowException 错误,提示我在 get{} 或 Calc() 函数上存在无限循环或递归,取决于编辑哪个文本框。我希望应用程序在每次未编辑文本框时根据 Calc() 函数计算数字。我还想为文本框定义一些起始值,但还没有弄清楚如何做到这一点。

有什么想法可以修复循环错误和初始值定义吗?

.xaml 代码中的文本框遵循以下模式:Text="{Binding DistanceBox}"

完整的后台代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;

namespace ConverterApp
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new Variables();
}
}

public class Variables : INotifyPropertyChanged
{
// Declare the PropertyChanged event.
public event PropertyChangedEventHandler PropertyChanged;

private double m_distanceBox;
public double DistanceBox
{
get { return m_distanceBox; }
set
{
//If value hasn't changed, don't do anything
//if (m_distanceBox == value)
// return;
m_distanceBox = value;
// modify calc to read the text values
Calc();
// Call NotifyPropertyChanged when the source property
// is updated.
//if(PropertyChanged!= null)
NotifyPropertyChanged("DistanceBox");
}
}

private double m_widthBox;
public double WidthBox
{
get { return m_widthBox; }
set
{
m_widthBox = value;
// modify calc to read the text values
Calc();
// Call NotifyPropertyChanged when the source property
// is updated.
NotifyPropertyChanged("WidthBox");
}
}

private double m_lengthBox;
public double LengthBox
{
get { return m_lengthBox; }
set
{
m_lengthBox = value;
// modify calc to read the text values
Calc();
// Call NotifyPropertyChanged when the source property
// is updated.
NotifyPropertyChanged("LengthBox");
}
}

private double m_lensBox;
public double LensNeeded
{
get { return m_lensBox; }
set
{
m_lensBox = value;
// modify calc to read the text values
Calc();
// Call NotifyPropertyChanged when the source property
// is updated.
NotifyPropertyChanged("LensNeeded");
}
}

public void Calc()
{
double WidthBased = 2.95 * (DistanceBox / WidthBox);
double LengthBased = 3.98 * (DistanceBox / LengthBox);

if (WidthBased < LengthBased)
{
LensNeeded = Math.Round(WidthBased,2);
}else{
LensNeeded = Math.Round(LengthBased,2);
}
}

// NotifyPropertyChanged will raise the PropertyChanged event,
// passing the source property that is being updated.
public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this,
new PropertyChangedEventArgs(propertyName));
}
}
}
}

最佳答案

LensNeeded 的 setter 中调用 Calc,calc 依次设置 ​​LensNeeded,即 LensNeeded 的 setter调用Calc等。这种循环导致了StackOverflow。

不要在这样的 setter 中计算属性,使相应的属性成为“虚拟”(动态计算值而不是从支持字段获取值),例如

public double WidthBased
{
get { return 2.95 * (DistanceBox / WidthBox); }
}

要更新此类属性的绑定(bind),您可以在所有相关属性的 setter 中引发属性更改事件,这里是 DistanceBoxWidthBox 的 setter 。

private double m_distanceBox;
public double DistanceBox
{
get { return m_distanceBox; }
set
{
if (m_distanceBox != value)
{
m_distanceBox = value;
NotifyPropertyChanged("DistanceBox");
NotifyPropertyChanged("WidthBased");
}
}
}
<小时/>

初始值可以在变量类的构造函数中设置,也可以直接在字段声明中设置,例如

private double m_distanceBox = 10;
public double DistanceBox //...

关于c# - WPF4/C# - System.StackOverflowException 崩溃应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6325909/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com