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

时间:2016-02-16 17:21:00

标签: c# wpf xaml data-binding datagrid

我无法在用户界面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>
  

list 是上面Binding中的字符串列表。通常当我设置CanUserAddRows="True"时,我能够添加行在其他示例中自动在UI上。

我的财产如下:

public List<string> list { get; set; }

在显示DataGrid之前,它已被初始化。因此,无需为此属性实现INotifyPropertyChanged

有人可以解释一下DataGrid这样做的原因吗?如何实现理想的行为?

1 个答案:

答案 0 :(得分:3)

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

一个选项是创建自己的类,公开Text和Length属性:

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

}

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

<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<StringMember>ObservableCollection<StringMember>,而不是string