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; } }
添加构造函数并相应地初始化
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。