加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 编辑wpf datagrid时“双向绑定需要Path或XPath”

发布时间:2020-12-15 08:17:03 所属栏目:百科 来源:网络整理
导读:ContractListUserControl.XAML DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Path=ContractList}" SelectedItem="{Binding Path=SelectedContract}" DataGrid.Columns DataGridTextColumn Binding="{Binding Path=Person.LastName}" Header=
ContractListUserControl.XAML
<DataGrid AutoGenerateColumns="False"
              ItemsSource="{Binding Path=ContractList}"
              SelectedItem="{Binding Path=SelectedContract}">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Path=Person.LastName}" Header="Last Name" />
            <DataGridTextColumn Binding="{Binding Path=Person.GivenName}" Header="Given Name" />
            <DataGridTextColumn Binding="{Binding Path=ContractStart,StringFormat=dd/MM/yyyy,Mode=TwoWay}" Header="Contract Start" />
            <DataGridTextColumn Binding="{Binding Path=ContractEnd,Mode=TwoWay}" Header="Contract End" />
        </DataGrid.Columns>
</DataGrid>

Contract.cs

public class Contract
{
    public DateTime ContractStart { get; set; }
    public DateTime ContractEnd { get; set; }
    public Person Person { get; set; }
}

Person.cs

public class Person
{
    public string LastName { get; set; }
    public string GivenName { get; set; }
}

ViewModel.cs

public class ContractListViewModel : INotifyPropertyChanged
{
    private ObservableCollection<Contract> _contractList;
    public ObservableCollection<Contract> ContractList
    {
        get { return _contractList; }
        set { SetField(ref _contractList,value,() => ContractList); } // Same as OnPropertyChanged
    }

    private Contract _selectedContract;
    public Contract SelectedContract
    {
        get { return _selectedCrew; }
        set { SetField(ref _selectedCrew,() => SelectedCrew); }
    }
}

如果我将datagrid设置为readonly,它工作正常,问题是当我直接编辑LastName和GivenName DataGrid列时,它会崩溃,并抛出InvalidOperationException,并显示消息“双向绑定需要Path或XPath”.但是,如果我只是编辑ContractStart和ContractEnd,它可以正常工作.

我寻找了一些帮助,我想我和这个家伙遇到了同样的情况:
DataGrid – “Two-way binding requires Path or XPath.”

所以问题是Person属性为null,答案说我应该初始化DataContext中绑定的对象,但是没有说明如何做到这一点.

解决方法

要实现Person属性的初始化,您可以修改如下
public class Contract
{
    public Contract()
    {
        Person = new Person();
    }

    public string RankName { get; set; }
    public string RankShortName { get; set; }
    public Person Person { get; set; }
}

添加构造函数并相应地初始化

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读