Ich habe zwei einfache Modellklassen und ein ViewModel ...
public class GridItem
{
public string Name { get; set; }
public int CompanyID { get; set; }
}
public class CompanyItem
{
public int ID { get; set; }
public string Name { get; set; }
}
public class ViewModel
{
public ViewModel()
{
GridItems = new ObservableCollection<GridItem>() {
new GridItem() { Name = "Jim", CompanyID = 1 } };
CompanyItems = new ObservableCollection<CompanyItem>() {
new CompanyItem() { ID = 1, Name = "Company 1" },
new CompanyItem() { ID = 2, Name = "Company 2" } };
}
public ObservableCollection<GridItem> GridItems { get; set; }
public ObservableCollection<CompanyItem> CompanyItems { get; set; }
}
... und ein einfaches Fenster:
<Window x:Class="DataGridComboBoxColumnApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding GridItems}" >
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}" />
<DataGridComboBoxColumn ItemsSource="{Binding CompanyItems}"
DisplayMemberPath="Name"
SelectedValuePath="ID"
SelectedValueBinding="{Binding CompanyID}" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
Das ViewModel ist DataContext
in App.xaml.cs auf das MainWindow eingestellt:
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
MainWindow window = new MainWindow();
ViewModel viewModel = new ViewModel();
window.DataContext = viewModel;
window.Show();
}
}
Wie Sie sehen, setze ich ItemsSource
das DataGrid auf die GridItems
Sammlung des ViewModel. Dieser Teil funktioniert, die einzelne Gitterlinie mit dem Namen "Jim" wird angezeigt.
Ich möchte auch ItemsSource
die ComboBox in jeder Zeile auf die CompanyItems
Sammlung des ViewModel setzen. Dieser Teil funktioniert nicht: Die ComboBox bleibt leer und im Debugger-Ausgabefenster wird eine Fehlermeldung angezeigt:
System.Windows.Data-Fehler: 2: FrameworkElement oder FrameworkContentElement für das Zielelement können nicht gefunden werden. BindingExpression: Path = CompanyItems; DataItem = null; Zielelement ist 'DataGridComboBoxColumn' (HashCode = 28633162); Die Zieleigenschaft ist 'ItemsSource' (Typ 'IEnumerable').
Ich glaube, dass WPF erwartet CompanyItems
, eine Eigenschaft zu sein, GridItem
die nicht der Fall ist, und das ist der Grund, warum die Bindung fehlschlägt.
Ich habe bereits versucht mit einem zu arbeiten RelativeSource
und AncestorType
mag so:
<DataGridComboBoxColumn ItemsSource="{Binding CompanyItems,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type Window}}}"
DisplayMemberPath="Name"
SelectedValuePath="ID"
SelectedValueBinding="{Binding CompanyID}" />
Aber das gibt mir einen weiteren Fehler in der Debugger-Ausgabe:
System.Windows.Data-Fehler: 4: Quelle für Bindung mit Referenz 'RelativeSource FindAncestor, AncestorType =' System.Windows.Window ', AncestorLevel =' 1 '' kann nicht gefunden werden. BindingExpression: Path = CompanyItems; DataItem = null; Zielelement ist 'DataGridComboBoxColumn' (HashCode = 1150788); Die Zieleigenschaft ist 'ItemsSource' (Typ 'IEnumerable').
Frage: Wie kann ich die ItemsSource der DataGridComboBoxColumn an die CompanyItems-Auflistung des ViewModel binden? Ist das überhaupt möglich?
Vielen Dank für Ihre Hilfe im Voraus!