visual una tipo studio stackoverflowexception que produjo net excepción excepcion error controlada c# wpf data-binding crash stack-overflow

una - WPF4/C#- Aplicación System.StackOverflowException Crashing



system stackoverflowexception vb net (1)

A continuación puede ver mi código .xaml.cs. La aplicación abre bien Hay 4 cuadros de texto que el usuario puede cambiar. Cuando edita uno de los valores predeterminados en los cuadros de texto y luego hace clic en desactivar para no seleccionarlo, la aplicación falla con el error System.StackOverflowException, diciendo que tengo un ciclo infinito o recursión en la función get {} o Calc (), dependiendo de qué cuadro de texto está editado. Quiero que la aplicación calcule los números de acuerdo con la función Calc () cada vez que no se edite un cuadro de texto. También me gustaría definir algunos valores iniciales para los cuadros de texto, pero aún no he resuelto cómo hacerlo.

¿Alguna idea sobre cómo puedo solucionar el error de bucle y el valor inicial se define?

Los cuadros de texto en el código .xaml siguen este patrón: Text="{Binding DistanceBox}"

El código completo detrás es el siguiente:

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)); } } } }


En su setter de LensNeeded usted llama a Calc , LensNeeded su vez LensNeeded , el colocador de LensNeeded llama a Calc , etc. Esta circularidad conduce a .

No calcules propiedades en setters como ese, haz las propiedades respectivas "virtuales" (calcula el valor sobre la marcha en lugar de obtener el valor de un campo de respaldo), por ej.

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

Para hacer que los enlaces a dichas propiedades se actualicen, se pueden generar eventos cambiados por propiedades en todos los setters de las propiedades relacionadas, que serían los setters de DistanceBox y WidthBox .

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

Los valores iniciales se pueden establecer en el contructor de su clase de variables o directamente en las declaraciones de campo, por ej.

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