2016-06-01 14 views
0

Ich habe eine DataGrid gebunden an eine List<Coefficients> im Speicher. Die Coefficients Klasse hat eine string Name als ID, und viele andere Felder (einige Namen und identifizierende Details wurden geändert, um die Privatsphäre des Codes zu schützen). Der DataGrid Code ist wie folgt:Datagrid-Combobox-Spalte mit Werten aus einer anderen Spalte im selben Datagrid

<DataGrid 
    Name="coefficientList" 
    ItemsSource="{Binding Data.CoefficientList, Mode=TwoWay}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Path=Name, Mode=TwoWay}" /> 
     <DataGridTextColumn Binding="{Binding Path=Priority, Mode=TwoWay}" /> 
     ... 
    </DataGrid.Columns> 
</DataGrid> 

Nun werden die Elemente in der Datagrid müssen ein anderes Element in der gleichen Sammlung verweisen, so habe ich ein neues Feld in der Coefficients Klasse: string ReferencedName. Dies ist die Zeichenfolge-ID des referenzierten Elements in der Auflistung. Ich möchte also eine neue Spalte im Datagrid haben, um den Wert des referenzierten Elements über eine Combobox auszuwählen, und diese Combobox muss mit der Name-Spalte desselben Datagrids gefüllt werden.

Wie kann ich das erreichen? Bisher habe ich versucht, so etwas wie:

<DataGridTemplateColumn> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <ComboBox 
       SelectedValue="{Binding ReferencedName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
       ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, 
        Path=Data.NameList, Mode=TwoWay}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

wo NameList ist

public IEnumerable<string> NameList 
{ 
    get 
    { 
     return CoefficientList.Select(c => c.Name); 
    } 
} 

aber alles, was ich habe versucht, gibt bisher immer eine Combobox ohne Optionen und Fehler im Ausgabefenster wie

System.Windows.Data Error: 40 : BindingExpression path error: 'Data' property not found on 'object' ''DataGrid' (Name='coefficientList')'. BindingExpression:Path=Data.NameList; DataItem='DataGrid' (Name='coefficientList'); target element is 'ComboBox' (Name=''); target property is 'ItemsSource' (type 'IEnumerable')

Kann mir jemand in die richtige Richtung zeigen?

Antwort

1

Data.NameList ist eine Eigenschaft von DataContext Objekt. ändere den Bindeweg

+0

So einfach und doch so schwer zu fassen! Vielen Dank! – Charlie

+0

Ja, oft vergessen Sie es selbst, wenn Sie 'RelativeSource' verwenden – ASh

Verwandte Themen