我想在视图中添加可编辑的datagrid
并遇到此问题。当我将ItemSource
属性设置为ObservableCollection<string>
时,datagrid将显示电子邮件,但是没有新行允许用户添加电子邮件。它还不支持编辑集合中的值。当我尝试编辑电子邮件时,出现 System.InvalidOperationException :“双向绑定需要Path或XPath”。
然后,我创建了仅包含一个名为MyEmail
的属性的简单类Email
,并将ObservableCollection<MyEmail>
用作我的数据网格的ItemSource
。这样很好。它支持编辑新电子邮件并将其添加到数据网格。
public class MyEmail : INotifyPropertyChanged
{
private string email;
public string Email
{
get => this.email;
set
{
this.email = value;
PropertyChanged(this, new PropertyChangedEventArgs(nameof(this.Email)));
}
}
public event PropertyChangedEventHandler PropertyChanged = delegate { };
}
为了测试这一点,我使用了两个具有不同ItemSource
属性的相同数据网格。这样将一个绑定到ObservableCollection<MyEmail> Emails
,将第二个绑定到ObservableCollection<string> StringEmails
。
public partial class MainWindow : Window, INotifyPropertyChanged
{
private ObservableCollection<MyEmail> emails = new ObservableCollection<MyEmail>();
public ObservableCollection<MyEmail> Emails
{
get => this.emails;
set
{
this.emails = value;
PropertyChanged(this, new PropertyChangedEventArgs(nameof(this.Emails)));
}
}
private ObservableCollection<string> stringEmails = new ObservableCollection<string>();
public ObservableCollection<string> StringEmails
{
get => this.stringEmails;
set
{
this.stringEmails = value;
PropertyChanged(this, new PropertyChangedEventArgs(nameof(this.Emails)));
}
}
数据网格:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<DataGrid
ItemsSource="{Binding Emails}"
AutoGenerateColumns="False"
CanUserAddRows="True">
<DataGrid.Columns>
<DataGridTextColumn Header="Emails" Binding="{Binding Path=Email}"/>
</DataGrid.Columns>
</DataGrid>
<DataGrid Grid.Row="1"
ItemsSource="{Binding StringEmails}"
AutoGenerateColumns="False"
CanUserAddRows="True">
<DataGrid.Columns>
<DataGridTextColumn Header="String Emails" Binding="{Binding Path=.}"/>
</DataGrid.Columns>
</DataGrid>
有人知道导致这种现象的原因吗?
答案 0 :(得分:1)
有人知道导致这种现象的原因吗?
这是预期的行为。
要使新行显示在DataGrid
中,T
的{{1}} IEnumerable<T>
的类型ItemsSource
必须具有公共的无参数构造函数。而且您无法编辑DataGrid
本身,因为它是不可变的。
因此,如果要能够编辑string
中的数据,则应该(必须)使用属性创建自己的自定义类。