Binding ItemsSource de uma ComboBoxColumn no WPF DataGrid
Tenho duas classes simples de modelo e um 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; }
}
... e uma janela simples:
<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>
O ViewModel está definido como @ da MainWindDataContext
em 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();
}
}
Como você pode ver, defino oItemsSource
do DataGrid para oGridItems
coleção do ViewModel. Esta parte funciona, a única linha da grade com o nome "Jim" é exibid
Também quero definir oItemsSource
da ComboBox em todas as linhas doCompanyItems
coleção do ViewModel. Esta parte não funciona: A ComboBox permanece vazia e, na janela Saída do depurador, vejo uma mensagem de erro:
System.Windows.Data Erro: 2: Não é possível localizar FrameworkElement ou FrameworkContentElement que regem o elemento de destino. BindingExpression: Path = CompanyItems; DataItem = nulo; o elemento de destino é 'DataGridComboBoxColumn' (HashCode = 28633162); propriedade de destino é 'ItemsSource' (tipo 'IEnumerable')
Acredito que o WPF esperaCompanyItems
para ser uma propriedade deGridItem
, que não é o caso, e é por isso que a ligação falh
Eu já tentei trabalhar com umRelativeSource
eAncestorType
igual a
<DataGridComboBoxColumn ItemsSource="{Binding CompanyItems,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type Window}}}"
DisplayMemberPath="Name"
SelectedValuePath="ID"
SelectedValueBinding="{Binding CompanyID}" />
Mas isso me dá outro erro na saída do depurador:
Erro System.Windows.Data: 4: Não é possível encontrar a origem da ligação com a referência 'RelativeSource FindAncestor, AncestorType =' System.Windows.Window ', AncestorLevel =' 1 ''. BindingExpression: Path = CompanyItems; DataItem = nulo; o elemento de destino é 'DataGridComboBoxColumn' (HashCode = 1150788); propriedade de destino é 'ItemsSource' (tipo 'IEnumerable')
Pergunta: Como posso vincular o ItemsSource do DataGridComboBoxColumn à coleção CompanyItems do ViewModel? É possível de alguma forma
Obrigado pela ajuda antecipadamente!