DataGrid WPF: liaison DataSource DataGridComboxBox à une collection de collections
Situation:
J'ai créé un DataGrid en XAML et le ItemsSource est lié à une ObservableCollection d'une certaine classe qui contient des propriétés. Puis, en C#, j'ai créer un DataGridTextColumn et un DataGridComboBoxColumn et lié à l'propriétés des objets à l'intérieur de l'ObservableCollection. Je peux lier le DataGridComboBoxColumn à une simple Collection, mais ce que je veux faire est de le lier à une collection de collections de chaînes, de sorte que pour chaque ligne de la zone de liste déroulante à l'intérieur de la grille de données est une collection différente de la chaîne. Je n'ai pas réussi à le faire...
Question:
Comment puis-je lier la DataGridCombBoxColumn afin que je puisse avoir une autre collection de chaînes de caractères pour chaque ligne de ce type de colonne?
Exemple De Code:
XAML:
<Window>
<!-- ... -->
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"/>
<!-- ... -->
</Window>
C#:
public class DataModelStatsOperations
{
public ObservableCollection<IStatsOperation> OperationsStats { get; set; }
}
public interface IStatsOperation
{
string Operation { get; set; }
Collection<string> Data{ get; set; }
}
public class StatsOperation : IStatsOperation
{
public StatsOperation(string operation, Collection<string> data)
{
Operation = operation;
Data = data;
}
public string Operation { get; set; }
public Collection<string> Data{ get; set; }
}
private ObservableCollection<IStatsOperation> dataOperations_ =
new ObservableCollection<IStatsOperation>();
//...
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.ToString(),
dataCollection));
DG_Operations.DataContext = new DataModelStatsOperations
{
OperationsStats = dataOperations_
};
//...
Toute aide serait grandement appréciée!
Notes:
Bon, alors après avoir lu les deux premières réponses, j'ai remarqué quelque chose. Ma liaison est vraiment pas juste! Maintenant, ce que je veux faire, c'est quelque chose de semblable à ce que AndyG 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")
});
D'erreur: "Impossible de convertir implicitement le type de Système.De Windows.Les données.De liaison " à " Système.Les Collections.IEnumerable'."
Comment le ItemsSource être lié à des Données?
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, ce devrait être facile... deuxièmement, pourquoi êtes-vous en bâtiment (et obligatoire) de colonnes en C#? Eek.
XAML (je suis à l'aide d'une grille régulière, parce que je suis paresseux):
C#:
Les Résultats:
WPF grille avec zone de liste déroulante dynamique des choix 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'objet qui est représenté par une ligne particulière. Donc si je comprends bien, vous avez un StatsOperation pour chaque ligne, de sorte que la zone de texte de la colonne est lié à l'opération, qui est la façon dont vous l'avez, et la zone de liste déroulante de la colonne ItemsSource doit être lié à une Collection. Pour l'instant il semble comme il est lié à un
Collection<Collection<string>>
.Je n'ai pas les colonnes définies dans le code-behind avant, donc voici un exemple dans le code XAML. J'ai trouvé ComboBoxColumn peut être difficile parfois, j'ai donc montré comment vous pouvez avoir une zone de liste déroulante dans la colonne à l'aide d'un TemplateColumn ou un ComboBoxColumn. J'ai copier collé de mon propre code, donc il suffit de remplacer 'dg' avec 'WPFToolkit' dans votre cas:
Je suis en supposant que l'Opération de l'élément sélectionné, les Données sont les éléments à sélectionner à partir, et que votre grille de données est lié à une collection de StatsOperation. Bonne chance!
Pour fixer votre ItemsSource de Liaison Erreur d'utiliser le formulaire:
Évidemment on ne peut pas le faire dans le intializer de sorte que vous devrez déplacer vos déclarations autour d'un peu, mais qui devrait prendre soin de cette erreur dans votre mise à jour.
MODIFIER je suis désolé, je suis peu lent à minuits :). Voici une mise à jour de réponse. Il ressemble à l'excellent article de Vincent Sibal WPF DataGrid - DataGridComboBoxColumn v1 Intro répond à votre question. N'est ce pas?
Partielle - je pense qu'il y a une confusion dans ce que vous dites. Vous avez dit que vous avez besoin d'une collection de collection de chaînes dans chaque ligne, de sorte que la zone de liste modifiable pu montrer les différentes cordes pour des lignes différentes. Cependant, pour une zone de liste déroulante pour afficher un ensemble de chaînes de caractères, vous avez seulement besoin d'un ensemble de cordes, par ligne, pas une collection de collection de chaînes.
Maintenant, car vous avez besoin de collection de chaînes de caractères par ligne vous pourriez penser que vous auriez besoin de collection de collection de chaînes.
Est ma compréhension de votre question correcte? Si oui, alors votre mention de collection de collection de chaînes qui est faux.
Ce que vous avez réellement besoin est une collection de StatOperations dans lequel chaque StatOperation doit avoir une collection de chaînes de caractères. C'est exactement ce que vous aviez comme indiqué dans vos classes ci-dessus.
De faire des progrès, je vous suggère de modifier votre question et où exactement vous étiez coincé après la fixation de la liaison comme suggéré par AndyG.