C# 无法在DataGrid UI中自动添加新行

C# 无法在DataGrid UI中自动添加新行,c#,wpf,xaml,data-binding,datagrid,C#,Wpf,Xaml,Data Binding,Datagrid,我无法从UI在我的DataGrid中添加新行。下面是我的代码 <DataGrid CanUserAddRows="True" Name="dg" ItemsSource="{Binding list}" AutoGenerateColumns="False" > <DataGrid.Columns> <DataGridTextColumn Binding="{Binding Path=.}" Header="Text"/>

我无法从UI在我的
DataGrid
中添加新行。下面是我的代码

<DataGrid CanUserAddRows="True" Name="dg"  ItemsSource="{Binding list}"  AutoGenerateColumns="False" >
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Path=.}" Header="Text"/>
        <DataGridTextColumn Binding="{Binding Length}" Header="Length"/>            
    </DataGrid.Columns>
</DataGrid>
在显示
DataGrid
之前,它已初始化。因此,无需为此属性实现
INotifyPropertyChanged


有人能解释一下为什么
DataGrid
会这样吗?如何实现期望的行为

问题在于
string
没有无参数构造函数,因此网格无法为空网格行创建新实例,以允许用户添加新行。此外,网格无法将“.”属性“设置”到字符串上

一个选项是创建自己的类,该类公开文本和长度属性:

public class StringMember : INotifyPropertyChanged
{
private string m_actualString;
public string Text
{
    get { return m_actualString; }
    set
    {
        m_actualString = value;
        //OnPropertyChanged("Text");
        //OnPropertyChanged("Length");
    }
}

public int Length { get { return Value.Length; } }

//public event PropertyChangedEventHandler PropertyChanged;        
//protected virtual void OnPropertyChanged(string propertyName = null)
//{
//    PropertyChangedEventHandler handler = PropertyChanged;
//    if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
//}
<DataGrid CanUserAddRows="True" Name="dg"  ItemsSource="{Binding list}"  AutoGenerateColumns="False" >
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Text}" Header="Text"/>
        <DataGridTextColumn Binding="{Binding Length}" Header="Length"/>            
    </DataGrid.Columns>
</DataGrid>
}

然后,您的XAML将绑定到您的属性:

public class StringMember : INotifyPropertyChanged
{
private string m_actualString;
public string Text
{
    get { return m_actualString; }
    set
    {
        m_actualString = value;
        //OnPropertyChanged("Text");
        //OnPropertyChanged("Length");
    }
}

public int Length { get { return Value.Length; } }

//public event PropertyChangedEventHandler PropertyChanged;        
//protected virtual void OnPropertyChanged(string propertyName = null)
//{
//    PropertyChangedEventHandler handler = PropertyChanged;
//    if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
//}
<DataGrid CanUserAddRows="True" Name="dg"  ItemsSource="{Binding list}"  AutoGenerateColumns="False" >
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Text}" Header="Text"/>
        <DataGridTextColumn Binding="{Binding Length}" Header="Length"/>            
    </DataGrid.Columns>
</DataGrid>


在这种情况下,“list”属性将是
list
ObservableCollection
而不是
string
问题在于
string
没有无参数构造函数,因此网格无法为空网格行创建新实例,以允许用户添加新行。此外,网格无法将“.”属性“设置”到字符串上

一个选项是创建自己的类,该类公开文本和长度属性:

public class StringMember : INotifyPropertyChanged
{
private string m_actualString;
public string Text
{
    get { return m_actualString; }
    set
    {
        m_actualString = value;
        //OnPropertyChanged("Text");
        //OnPropertyChanged("Length");
    }
}

public int Length { get { return Value.Length; } }

//public event PropertyChangedEventHandler PropertyChanged;        
//protected virtual void OnPropertyChanged(string propertyName = null)
//{
//    PropertyChangedEventHandler handler = PropertyChanged;
//    if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
//}
<DataGrid CanUserAddRows="True" Name="dg"  ItemsSource="{Binding list}"  AutoGenerateColumns="False" >
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Text}" Header="Text"/>
        <DataGridTextColumn Binding="{Binding Length}" Header="Length"/>            
    </DataGrid.Columns>
</DataGrid>
}

然后,您的XAML将绑定到您的属性:

public class StringMember : INotifyPropertyChanged
{
private string m_actualString;
public string Text
{
    get { return m_actualString; }
    set
    {
        m_actualString = value;
        //OnPropertyChanged("Text");
        //OnPropertyChanged("Length");
    }
}

public int Length { get { return Value.Length; } }

//public event PropertyChangedEventHandler PropertyChanged;        
//protected virtual void OnPropertyChanged(string propertyName = null)
//{
//    PropertyChangedEventHandler handler = PropertyChanged;
//    if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
//}
<DataGrid CanUserAddRows="True" Name="dg"  ItemsSource="{Binding list}"  AutoGenerateColumns="False" >
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Text}" Header="Text"/>
        <DataGridTextColumn Binding="{Binding Length}" Header="Length"/>            
    </DataGrid.Columns>
</DataGrid>


在这种情况下,您的“list”属性将是
list
observedcollection
,而不是
string

,据我所知,绑定数据网格时无法添加行manually@Rodolfo当然可以。@Rodolfo那个例子是针对DataGridView的。据我所知,此处不适用于绑定DataGrid时无法添加行manually@Rodolfo当然可以。@Rodolfo那个例子是针对DataGridView的。这里不适用,那么如何处理我的模型类没有默认构造函数def的情况呢。?一个可选参数可以吗?那么你知道有什么解决方法吗?我不需要创建派生/包装类?那么如何处理我的模型类没有默认构造函数def的情况呢。?一个可选参数可以吗?那么你知道有什么解决方法吗?我不需要创建派生/包装类?