2014-06-17 7 views
6

ContractListUserControl.XAML"Zwei-Wege-Bindung erfordert Pfad oder XPath", wenn bearbeiten wpf Datagrid

<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); } 
    } 
} 

Wenn ich das Datagrid als nur lesen, funktioniert es gut, Problem ist, wenn ich die DataGrid-Spalte LastName und GivenName direkt bearbeiten, wird es abstürzen und die InvalidOperationException mit der Nachricht "Zwei-Wege-Bindung erfordert Path oder XPath". Aber wenn ich nur ContractStart und ContractEnd bearbeite, funktioniert es gut.

ich nach Hilfe gesucht, und ich glaube, ich die gleiche Situation mit diesem Typ erfüllen: DataGrid - "Two-way binding requires Path or XPath."

Das Problem ist also, dass die Person Eigenschaft ist null, und die Antwort gesagt, dass ich das Objekt initialisieren soll, dass Bindung im DataContext aber nicht gesagt, wie das geht.

Antwort

8

die Initialisierung Person Eigenschaft erzielen, die Sie ändern können, wie

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

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

fügen Sie einen Konstruktor und initialisieren entsprechend

+0

Oooo folgt !! Ich hätte diesen Ansatz denken sollen. Es funktioniert, Danke! –