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, StringFormat=dd/MM/yyyy, 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; }
}

人.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, value, () => SelectedCrew); }
    }
}

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

我寻求了一些帮助,我认为我遇到了与这个人相同的情况:
DataGrid - "Two-way binding requires Path or XPath."

因此,问题在于Person属性为null,答案是说我应该初始化在DataContext中绑定(bind)的对象,但没有说明如何做到这一点。

最佳答案

要实现Person属性的初始化,您可以进行如下修改

public class Contract
{
    public Contract()
    {
        Person = new Person();
    }

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

添加一个构造函数并进行相应的初始化

09-30 17:23
查看更多