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 DataContextin 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 ItemsSourcedas DataGrid auf die GridItemsSammlung des ViewModel. Dieser Teil funktioniert, die einzelne Gitterlinie mit dem Namen "Jim" wird angezeigt.
Ich möchte auch ItemsSourcedie ComboBox in jeder Zeile auf die CompanyItemsSammlung 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, GridItemdie nicht der Fall ist, und das ist der Grund, warum die Bindung fehlschlägt.
Ich habe bereits versucht mit einem zu arbeiten RelativeSourceund AncestorTypemag 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!