У меня есть два простых класса 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:
<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 установлен на DataContext MainWindow
в 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. Эта часть работает, отображается одна строка сетки с именем «Джим».
Я также хочу установить ItemsSource
ComboBox в каждой строке в коллекцию CompanyItems
ViewModel. Эта часть не работает: ComboBox остается пустым, а в окне вывода отладчика я вижу сообщение об ошибке:
System.Windows.Data Error: 2: Cannot найти управляющий FrameworkElement или FrameworkContentElement для цели элемент. BindingExpression: Путь = CompanyItems; DataItem = null; целевой элемент 'DataGridComboBoxColumn' (HashCode = 28633162); целевое свойство is 'ItemsSource' (type '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: Путь = CompanyItems; DataItem = null; целевой элемент 'DataGridComboBoxColumn' (HashCode = 1150788); целевое свойство 'ItemsSource' (тип 'IEnumerable')
Вопрос. Как привязать ItemsSource DataGridComboBoxColumn к коллекции CompanyItems ViewModel? Возможно ли это вообще?
Заранее благодарю за помощь!