我无法在用户界面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
这样做的原因吗?如何实现理想的行为?
答案 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
。