首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >绑定到字符串的DataGrid不工作

绑定到字符串的DataGrid不工作
EN

Stack Overflow用户
提问于 2018-07-02 09:38:18
回答 1查看 464关注 0票数 2

我想在我的视图中添加一个可编辑的datagrid并遇到这个问题。当我将ItemSource属性设置为ObservableCollection<string>时,datagrid会显示电子邮件,但没有新行允许用户添加电子邮件。它也不支持编辑集合中的值。当我试图编辑电子邮件时,我得到了System.InvalidOperationException:‘双向绑定需要路径或XPath’。

然后,我创建了简单的类MyEmail,只包含一个名为Email的属性,并使用ObservableCollection<MyEmail>作为数据集的ItemSource。这个很好用。它支持编辑和添加新的电子邮件的数据。

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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)));
        }
    }

数据:

代码语言:javascript
运行
复制
    <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>

有人知道是什么导致了这种行为吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-02 09:47:38

有人知道是什么导致了这种行为吗?

这是预期的行为。

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51133124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档