绑定到可观察字符串集合的数据网格不起作用



我想在我的视图中添加一个可编辑的datagrid,但遇到了这个问题。当我将ItemSource属性设置为ObservableCollection<string>数据网格显示电子邮件时,但没有允许用户添加电子邮件的新行。它也不支持编辑集合中的值。当我尝试编辑电子邮件时,我收到System.InvalidOperationException:">双向绑定需要路径或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>

有谁知道是什么原因导致这种行为?

有谁知道是什么原因导致这种行为?

这是预期的行为。

要使新行显示在DataGrid中,DataGridIEnumerable<T>ItemsSource的类型T必须有一个公共的无参数构造函数。而且您无法编辑string本身,因为它是不可变的。

因此,如果您希望能够编辑DataGrid中的数据,您应该(必须(使用属性创建自己的自定义类。

最新更新