Ich gehe bonkers mit dem folgenden WPF DataGrid + ComboBox-Szenario.
Ich habe eine Reihe von Klassen, die wie folgt aussehen;
class Owner
{
int ID { get; }
string Name { get; }
public override ToString()
{
return this.Name;
}
}
class House
{
int ID { get; }
Owner HouseOwner { get; set; }
}
class ViewModel
{
ObservableCollection<Owner> Owners;
ObservableCollection<House> Houses
}
Nun ist mein gewünschtes Ergebnis ein DataGrid, das eine Liste von Zeilen des Typs Haus und in einer der Spalten befindet sich eine ComboBox, die es dem Benutzer ermöglicht, den Wert von House.HouseOwner .
In diesem Szenario ist der DataContext für das Grid ViewModel.Houses und für die ComboBox möchte ich, dass die ItemsSource an ViewModel.Owners gebunden wird.
Ist das überhaupt möglich? Ich gehe mental mit diesem... das Beste, was ich in der Lage gewesen, zu tun ist, um korrekt die ItemsSource gebunden, aber die ComboBox (innerhalb einer DataGridTemplateColumn) ist nicht die richtigen Werte für House.HouseOwner in jeder Zeile.
HINWEIS: Wenn ich die ComboBox aus dem Bild nehmen und einen TextBlock in der DataTemplate stattdessen setzen, kann ich korrekt die Werte für jede Zeile sehen, aber immer sowohl eine ItemsSource als auch zeigen den richtigen Wert in der Auswahl funktioniert nicht für mich...
In meinem Code habe ich den DataContext im Fenster auf ViewModel und im Raster wird der DataContext auf ViewModel.Houses . Für alles außer dieser Combobox, es funktioniert...
Meine XAML für die beanstandete Spalte sieht wie folgt aus;
<DataGridTemplateColumn Header="HouseOwner">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Path=DataContext.Owners, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
DisplayMemberPath="Name"
SelectedItem="{Binding HouseOwner, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
SelectedValue="{Binding HouseOwner.ID, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Mode=OneWay}"
SelectedValuePath="ID" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Ich würde mich freuen, wenn mir jemand helfen könnte... es scheint, dass ein bisschen Voodoo nötig ist...