绑定到字符串的ObservableCollection的DataGrid不起作用

时间:2018-07-02 09:38:19

标签: c# wpf data-binding datagrid

我想在视图中添加可编辑的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>

有人知道导致这种现象的原因吗?

1 个答案:

答案 0 :(得分:1)

  

有人知道导致这种现象的原因吗?

这是预期的行为。

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

因此,如果要能够编辑string中的数据,则应该(必须)使用属性创建自己的自定义类。