У меня есть два простых класса Model и 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; }
}
... и простое окно:
<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>
ViewModel установлен в MainWindow DataContext в App.xaml.cs:
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();
    }
}
Как вы можете видеть, я установил ItemsSource DataGrid в коллекцию GridItems ViewModel. Эта часть работает, отображается единственная строка Grid с названием "Jim".
Я также хочу установить ItemsSource ComboBox в каждой строке в коллекцию CompanyItems ViewModel. Эта часть не работает: ComboBox остается пустым и в окне вывода отладчика появляется сообщение об ошибке:
Ошибка System.Windows.Data: 2: не удается найти Управление FrameworkElement или FrameworkContentElement для целевой элемент. BindingExpression: Path = CompanyItems; DataItem = NULL; целевой элемент 'DataGridComboBoxColumn' (HashCode = 28633162); целевое свойство это "ItemsSource" (тип "IEnumerable" )
Я считаю, что WPF ожидает, что CompanyItems будет свойством GridItem, что не так, и что причина неудачи привязки.
Я уже пытался работать с RelativeSource и AncestorType следующим образом:
<DataGridComboBoxColumn ItemsSource="{Binding CompanyItems, 
    RelativeSource={RelativeSource Mode=FindAncestor,
                                   AncestorType={x:Type Window}}}"
                        DisplayMemberPath="Name"
                        SelectedValuePath="ID"
                        SelectedValueBinding="{Binding CompanyID}" />
Но это дает мне еще одну ошибку в выходе отладчика:
Ошибка System.Windows.Data: 4: невозможно найти источник для привязки со ссылкой 'RelativeSource FindAncestor, AncestorType = 'System.Windows.Window', AncestorLevel = '1'". BindingExpression: Path = CompanyItems; DataItem = NULL; целевой элемент 'DataGridComboBoxColumn' (HashCode = 1150788); целевое свойство "ItemsSource" (тип "IEnumerable" )
Вопрос: Как я могу привязать ItemSource DataGridComboBoxColumn к коллекции CompanyItems ViewModel? Возможно ли вообще?
Благодарим вас за помощь!