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

前端之家收集整理的这篇文章主要介绍了c# – 编辑wpf datagrid时“双向绑定需要Path或XPath”前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
ContractListUserControl.XAML
  1. <DataGrid AutoGenerateColumns="False"
  2. ItemsSource="{Binding Path=ContractList}"
  3. SelectedItem="{Binding Path=SelectedContract}">
  4. <DataGrid.Columns>
  5. <DataGridTextColumn Binding="{Binding Path=Person.LastName}" Header="Last Name" />
  6. <DataGridTextColumn Binding="{Binding Path=Person.GivenName}" Header="Given Name" />
  7. <DataGridTextColumn Binding="{Binding Path=ContractStart,StringFormat=dd/MM/yyyy,Mode=TwoWay}" Header="Contract Start" />
  8. <DataGridTextColumn Binding="{Binding Path=ContractEnd,Mode=TwoWay}" Header="Contract End" />
  9. </DataGrid.Columns>
  10. </DataGrid>

Contract.cs

  1. public class Contract
  2. {
  3. public DateTime ContractStart { get; set; }
  4. public DateTime ContractEnd { get; set; }
  5. public Person Person { get; set; }
  6. }

Person.cs

  1. public class Person
  2. {
  3. public string LastName { get; set; }
  4. public string GivenName { get; set; }
  5. }

viewmodel.cs

  1. public class ContractListviewmodel : INotifyPropertyChanged
  2. {
  3. private ObservableCollection<Contract> _contractList;
  4. public ObservableCollection<Contract> ContractList
  5. {
  6. get { return _contractList; }
  7. set { SetField(ref _contractList,value,() => ContractList); } // Same as OnPropertyChanged
  8. }
  9.  
  10. private Contract _selectedContract;
  11. public Contract SelectedContract
  12. {
  13. get { return _selectedCrew; }
  14. set { SetField(ref _selectedCrew,() => SelectedCrew); }
  15. }
  16. }

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

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

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

解决方法

要实现Person属性的初始化,您可以修改如下
  1. public class Contract
  2. {
  3. public Contract()
  4. {
  5. Person = new Person();
  6. }
  7.  
  8. public string RankName { get; set; }
  9. public string RankShortName { get; set; }
  10. public Person Person { get; set; }
  11. }

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

猜你在找的C#相关文章