简单的WPF数据绑定导致StackOverFlow异常

时间:2015-05-25 12:39:58

标签: c# wpf data-binding

我的WPF项目中有以下XAML:

<Window x:Class="DataBindToLocalVars.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <TextBox x:Name="txt2" HorizontalAlignment="Left" Height="23" Margin="150,94,0,0" TextWrapping="Wrap" Text="{Binding Path=value1}" VerticalAlignment="Top" Width="120"/>
    <TextBox x:Name="txt1" HorizontalAlignment="Left" Height="23" Margin="150,140,0,0" TextWrapping="Wrap" Text="{Binding Path=value2}" VerticalAlignment="Top" Width="120"/>
    <Label Content="Value 2" HorizontalAlignment="Left" Margin="107,91,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.577,-0.602"/>
    <Label Content="Value1" HorizontalAlignment="Left" Margin="107,145,0,0" VerticalAlignment="Top"/>

</Grid>

我的代码隐藏文件中的以下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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 DataBindToLocalVars
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public string value1
    {
        get { return value1; }
        set
        {
            value1 = value;
            this.NotifyPropertyChange("value1");
        }
    }
    public string value2 {
        get { return value2; }
        set {
        value2 = value;
        this.NotifyPropertyChange("value2");
    } }
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;

        value1 = "20";
        value2 = "40"; 
    }

    public void NotifyPropertyChange(string propName)
    {
        this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }
}
}

我正在实现INotifyPropertyChange接口,以便在属性value1和value2更改时得到通知。但运行此代码会给我一个堆栈溢出异常。这是为什么?

2 个答案:

答案 0 :(得分:1)

这是你的原因:

public string value1
{
    get { return value1; }
    set
    {
        value1 = value;
        this.NotifyPropertyChange("value1");
    }
}

你的属性getter和setter完全是递归的(它们会导致自己调用)。

Idiomatic C#使用PascalCasing作为属性名称,那么如何:

private string value1;

public string Value1
{
    get { return value1; }
    set
    {
        value1 = value;
        this.NotifyPropertyChange("Value1");
    }
}

此处getter和setter使用私有value1字段。

您的INotifyPropertyChanged实施中也存在问题。当事件没有订阅者时,处理程序将为null。您需要防范这一点,否则您将获得NullReferenceException

public void NotifyPropertyChange(string propName)
{
    var handler = PropertyChanged;
    if (handler != null) handler(this, new PropertyChangedEventArgs(propName));
}

答案 1 :(得分:0)

当然,您要在酒店内设置酒店 你需要在属性中设置一个私有成员,然后你提出属性已更改,因此将通知Binding对象对其进行采样。

首先请使用大写字母。

   private int _value1;
   public int Value1
   {
      get{ return _value1; }
      set
      { 
          _value1 = value;
          NotifyPropertyChange("Value1"); 
      }
   }

编辑:

你正在运行什么.Net版本。 我记得.net 4中的一个问题,你必须这样做。

 public event PropertyChangedEventHandler PropertyChanged = delelgate{};

因此,在绑定订阅它之前,事件不会为null。