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; }
}
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, value, () => SelectedCrew); }
}
}
If I set the datagrid as readonly, it works fine, problem is when I edit the LastName and GivenName DataGrid Column directly, it will crash, and throw the InvalidOperationException with message "Two-way binding requires Path or XPath". But if I just edit the ContractStart and ContractEnd it works fine.
I searched for some help, and I think I meet the same situation with this guy: DataGrid - "Two-way binding requires Path or XPath."
So the problem is that the Person Property is null, and the answer said that I should initialize the object that binding in the DataContext but didn't say how to do that.
to achieve the initialization of Person property you may modify as follows
public class Contract
{
public Contract()
{
Person = new Person();
}
public string RankName { get; set; }
public string RankShortName { get; set; }
public Person Person { get; set; }
}
add a constructor and initialize accordingly
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With