我想在我的视图中添加一个可编辑的datagrid并遇到这个问题。当我将ItemSource属性设置为ObservableCollection<string>时,datagrid会显示电子邮件,但没有新行允许用户添加电子邮件。它也不支持编辑集合中的值。当我试图编辑电子邮件时,我得到了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>有人知道是什么导致了这种行为吗?
发布于 2018-07-02 09:47:38
有人知道是什么导致了这种行为吗?
这是预期的行为。
要在DataGrid中显示新行,DataGrid的IEnumerable<T> ItemsSource的类型T必须有一个公共的无参数构造函数。而且您不能编辑string本身,因为它是不可变的。
因此,如果您想要编辑DataGrid中的数据,您应该(必须)使用属性创建自己的自定义类。
https://stackoverflow.com/questions/51133124
复制相似问题