WPF DataGrid: DataGridComboxBox ItemsSource, liaison à une collection de collections

Situation:

J’ai créé un DataGrid en XAML et le ItemsSource est lié à un ObservableCollection d’une classe contenant des propriétés. Ensuite, en C #, je crée un DataGridTextColumn et un DataGridComboBoxColumn et les lie aux propriétés des objects à l’intérieur de ObservableCollection. Je peux lier le DataGridComboBoxColumn à une collection simple, mais ce que je veux faire, c’est le lier à une collection de collections de chaînes afin que, pour chaque ligne, la ComboBox à l’intérieur du DataGrid ait une collection différente de chaîne. J’ai échoué à le faire …

Question:

Comment puis-je lier le DataGridCombBoxColumn afin que je puisse avoir une collection différente de chaînes pour chaque ligne de ce type de colonne?

Exemple de code:

XAML:

  WPFToolkit:DataGrid x:Name="DG_Operations" Margin="10,5,10,5" Height="100" HorizontalAlignment="Stretch" FontWeight="Normal" ItemsSource="{Binding Path=OperationsStats}" AlternatingRowBackground="{DynamicResource SpecialColor}" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Visible" SelectionMode="Extended" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeRows="True" CanUserSortColumns="True" AutoGenerateColumns="False" IsReadOnly="False" IsEnabled="True" BorderThickness="1,1,1,1" VerticalAlignment="Stretch"/>   

C #:

 public class DataModelStatsOperations { public ObservableCollection OperationsStats { get; set; } } public interface IStatsOperation { ssortingng Operation { get; set; } Collection Data{ get; set; } } public class StatsOperation : IStatsOperation { public StatsOperation(ssortingng operation, Collection data) { Operation = operation; Data = data; } public ssortingng Operation { get; set; } public Collection Data{ get; set; } } private ObservableCollection dataOperations_ = new ObservableCollection(); //... Binding items = new Binding(); PropertyPath path = new PropertyPath("Operation"); items.Path = path; DG_Operations.Columns.Add(new DataGridTextColumn() { Header = "Operations", Width = 133, Binding = items }); DG_Operations.Columns.Add(new DataGridComboBoxColumn() { Header = "Data", Width = 190, ItemsSource = /*???*/, SelectedValueBinding = new Binding("Data"), TextBinding = new Binding("Data") }); dataOperations_.Add(new StatsOperation(CB_Operation.SelectedItem.ToSsortingng(), dataCollection)); DG_Operations.DataContext = new DataModelStatsOperations { OperationsStats = dataOperations_ }; //... 

Toute aide serait grandement appréciée!

Remarques:

Bon, alors après avoir lu les deux premières réponses, j’ai remarqué quelque chose. Ma reliure n’est vraiment pas correcte! Maintenant, ce que je veux faire est quelque chose de similaire à ce que AndyG a proposé:

 DG_Operations.Columns.Add(new DataGridComboBoxColumn() { Header = "Data", Width = 190, ItemsSource = new Binding("Data"), //notice this here does not work (have a look at the following error) SelectedValueBinding = new Binding("Operation"), TextBinding = new Binding("Operation") }); 

Erreur: “Impossible de convertir implicitement le type ‘System.Windows.Data.Binding’ en ‘System.Collections.IEnumerable’.”

Comment le ItemsSource peut-il être lié aux données?

Premièrement, cela devrait être facile … deuxièmement, pourquoi construisez-vous (et liez) des colonnes en C #? Eek.

XAML (j’utilise une grid régulière parce que je suis paresseux):

                 

C # :

 void Window1_Loaded(object sender, RoutedEventArgs e) { var dahList = new List(); dahList.Add(new StatsOperation { Operation = "Op A", Choices = new ssortingng[] { "One", "Two", "Three" }, }); dahList.Add(new StatsOperation { Operation = "Op B", Choices = new ssortingng[] { "4", "5", "6" }, }); this.MyListView.ItemsSource = dahList; } 

Les resultats:

Grille WPF avec choix de zones de liste déroulante dynamics http://www.singingeels.com/Articles/Articles/UserImage.aspx?ImageID=b1e3f880-c278-4d2b-bcc2-8ad390591200

Je pense que l’erreur est dans la façon dont vous avez fait votre liaison. Lorsque vous définissez une colonne, la liaison est liée à l’object représenté par une ligne particulière. Donc, si j’ai bien compris, vous avez une opération StatsOperation pour chaque ligne. La colonne TextBox est donc liée à une opération, ce qui est la manière dont vous l’avez, et la colonne ComboBox ItemsSource doit être liée à une collection. À l’heure actuelle, il semble que cela soit lié à une Collection> .

Je n’ai jamais défini de colonnes dans code-behind alors voici un exemple en XAML. J’ai trouvé que ComboBoxColumn peut être délicat parfois, alors j’ai montré comment vous pouvez avoir une liste déroulante dans la colonne en utilisant soit un TemplateColumn, soit un ComboBoxColumn. J’ai copié-collé à partir de mon propre code, remplacez simplement “dg” par “WPFToolkit” dans votre cas:

                     

Je suppose que l’opération est l’élément sélectionné, les données les éléments à sélectionner et que votre grid de données est liée à une collection de StatsOperation. Bonne chance!

Pour corriger votre erreur de liaison ItemsSource, utilisez le formulaire:

 BindingOperations.SetBinding(new DataGridComboBoxColumn(), DataGridComboBoxColumn.ItemsSourceProperty, new Binding("Data")); 

Vous ne pouvez évidemment pas faire cela dans l’initialiseur, vous devez donc déplacer vos déclarations un peu, mais cela devrait résoudre cette erreur dans votre mise à jour.

EDIT Je suis désolé, je suis un peu lent au milieu des nuits :). Voici une réponse mise à jour. Cela semble être un excellent article de Vincent Sibal WPF DataGrid – DataGridComboBoxColumn v1 Intro répond à votre question. Le fait-il?

Partiel – Je pense qu’il y a une confusion dans ce que vous dites. Vous avez dit qu’il vous fallait une collection de chaînes dans chaque ligne pour que la liste déroulante puisse afficher différentes chaînes pour différentes lignes. Toutefois, pour qu’une zone de liste déroulante affiche un ensemble de chaînes, vous avez uniquement besoin d’une collection de chaînes, par ligne, et non d’une collection de chaînes.

Maintenant que vous avez besoin de la collection de chaînes par ligne, vous pensez peut-être que vous aurez besoin d’une collection de chaînes.

Est-ce que ma compréhension de votre question est correcte? Si c’est le cas, votre mention de collection ou collection de chaînes est fausse.

Ce dont vous avez réellement besoin est une collection de StatOperations dans laquelle chaque StatOperation devrait avoir une collection de chaînes. C’est exactement ce que vous aviez comme indiqué dans vos cours ci-dessus.

Pour progresser, je vous suggère de modifier votre question et d’indiquer où vous étiez coincé après avoir corrigé la reliure comme suggéré par AndyG.