J'ai besoin de lier certaines données à un DataGrid avec un nombre variable de colonnes. Je l'ai fait travailler en utilisant le code suivant:WPF: Comment rendre la liaison DataGrid avec des colonnes dynamiques modifiable?
int n = 0;
foreach (string title in TitleList)
{
DataGridTextColumn col = new DataGridTextColumn();
col.Header = title;
Binding binding = new Binding(string.Format("DataList[{0}]", n++));
binding.Mode = BindingMode.TwoWay;
col.Binding = binding;
grid.Columns.Add(col);
}
où DataList est déclarée comme:
public ObservableCollection<double> DataList { get; set; }
et titleList est déclarée comme:
public ObservableCollection<string> TitleList { get; set; }
Le problème est que, même si je spécifié Liaison TwoWay, c'est vraiment unidirectionnel. Lorsque je clique sur une cellule pour essayer de modifier, j'ai une exception "'EditItem' n'est pas autorisé pour cette vue". Ai-je manqué quelque chose dans l'expression de liaison?
P.S. J'ai trouvé un article de Deborah "Populating a DataGrid with Dynamic Columns in a Silverlight Application using MVVM". Cependant, j'ai eu du mal à le faire fonctionner pour mon cas (en particulier, je ne peux pas faire fonctionner la liaison d'en-tête). Même si cela a fonctionné, je suis toujours confronté à des problèmes tels que des styles de cellule incohérents. C'est pourquoi je me demande si je pourrais faire fonctionner mon code ci-dessus - avec un petit tweak?
EDIT: J'ai trouvé un autre message qui peut être lié à mon problème: Implicit Two Way binding. Il semble si vous liez à une liste de chaîne à une zone de texte en utilisant
<TextBox Text="{Binding}"/>
Vous obtiendrez une erreur comme « deux voies de liaison nécessite le chemin ou XPath ». Mais le problème peut être facilement résolu en utilisant
<TextBox Text="{Binding Path=DataContext, RelativeSource={RelativeSource Self}}"/>
ou
<TextBox Text="{Binding .}"/>
Quelqu'un peut-il me donner un indice si mon problème peut être résolu de la même manière?
je modifier ma réponse le problème est votre type de collection double. – blindmeis