J'ai deux classes de modèle simples et un 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; }
}
...et une simple fenêtre :
<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>
Le ViewModel est défini comme le modèle de la MainWindow DataContext
dans 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();
}
}
Comme vous pouvez le voir, j'ai défini le ItemsSource
du DataGrid à l'élément GridItems
de la collection ViewModel. Cette partie fonctionne, la seule ligne de la grille avec le nom "Jim" est affichée.
Je veux également définir le ItemsSource
de la ComboBox dans chaque rangée à l'adresse CompanyItems
de la collection ViewModel. Cette partie ne fonctionne pas : La ComboBox reste vide et dans la fenêtre de sortie du débogueur, je vois un message d'erreur :
Erreur System.Windows.Data : 2 : Cannot trouver le FrameworkElement ou le FrameworkContentElement pour l'élément cible. BindingExpression:Path=CompanyItems ; DataItem=null ; l'élément cible est DataGridComboBoxColumn' (HashCode=28633162) (HashCode=28633162) ; la propriété cible est 'ItemsSource' (type 'IEnumerable').
Je crois que WPF s'attend à ce que CompanyItems
pour être une propriété de GridItem
ce qui n'est pas le cas, et c'est la raison pour laquelle la liaison échoue.
J'ai déjà essayé de travailler avec un RelativeSource
et AncestorType
comme ça :
<DataGridComboBoxColumn ItemsSource="{Binding CompanyItems,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type Window}}}"
DisplayMemberPath="Name"
SelectedValuePath="ID"
SelectedValueBinding="{Binding CompanyID}" />
Mais cela me donne une autre erreur dans la sortie du débogueur :
Erreur System.Windows.Data : 4 : Impossible de trouver la source de la liaison avec la référence 'RelativeSource FindAncestor, AncestorType='System.Windows.Window', AncestorLevel='1''. BindingExpression:Path=CompanyItems ; DataItem=null ; l'élément cible est DataGridComboBoxColumn' (HashCode=1150) (HashCode=1150788) ; la propriété cible est ItemsSource' (type 'IEnumerable')
Question : Comment lier le ItemsSource de la colonne DataGridComboBoxColumn à la collection CompanyItems du ViewModel ? Est-ce possible ?
Merci d'avance pour votre aide !