当更改绑定到ObservableCollection的单元格值时,C#WPF DataGrid会崩溃应用程序

时间:2017-11-09 18:16:08

标签: c# wpf binding datagrid observablecollection

我是这个数据绑定的新手。但我不知道我做错了什么。 我有一个带有数据网格的简单表单。我创建了一个类的observablecollection。这个班只是两个属性。我绑定到observablecollection并且datagrid显示了显示的数据。所以这是有效的,但如果我去更改通过双击单元格更改数据网格中的值。当我点击进入它崩溃。

这是代码

 namespace TESTDELETE
 public class Basemap
{
    private string bmfilename;
    private string bmdesc;
    public Basemap(string filename, string desc)
    {
        this.bmfilename = filename;
        this.bmdesc = desc;
    }
    public string BMFileName {
        get {
            return bmfilename;
        }
        set { 
            BMFileName = value;
        }
    }
    public string BMDesc
    {
        get
        {
            return bmdesc;
        }
        set
        {
            BMDesc = value;
        }
    }

}
}

这是我的班级

<Window x:Class="TESTDELETE.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" Initialized="Window_Initialized">
<Border BorderBrush="Black" BorderThickness="1">
    <Grid>
        <Button Content="Button" HorizontalAlignment="Left" Margin="339,175,0,0" VerticalAlignment="Top" Width="75"/>
        <TabControl Margin="10">
            <TabItem Header="TabItem">
                <Grid Background="#FFE5E5E5">
                    <DataGrid x:Name="datagrid1" Margin="10" ItemsSource="{Binding}" AutoGenerateColumns="True">
                    </DataGrid>
                </Grid>
            </TabItem>
            <TabItem Header="TabItem">
                <Grid Background="#FFE5E5E5"/>
            </TabItem>
        </TabControl>
    </Grid>
</Border>

这是我的XAML

NavbarService

在底图类中发生错误。当尝试更改datagrid中单元格的值时,错误发生在已更改的属性的set函数中。 例如,在表单加载后,我更改包含值desc3的单元格。错误将发生在Basemap类中BMDesc的set函数中。 该错误表示TESTDELETE.exe中出现未处理的“System.StackOverflowException”类型异常

任何帮助都会很棒。

JD

1 个答案:

答案 0 :(得分:1)

BMFileNameBMDesc属性设置器不应设置自己的值,因为它会生成一个无限循环,导致应用程序崩溃。你应该为私人成员加价:

public class Basemap
{
    private string bmfilename;
    private string bmdesc;

    public Basemap(string filename, string desc)
    {
        this.bmfilename = filename;
        this.bmdesc = desc;
    }

    public string BMFileName
    {
        get
        {
            return bmfilename;
        }
        set
        {
            bmfilename = value;
        }
    }
    public string BMDesc
    {
        get
        {
            return bmdesc;
        }
        set
        {
            bmdesc = value;
        }
    }
}