2010-02-08 9 views
4

Essayer de se lier à une collection en WPF, je me suis ce qui suit pour travailler:Reliure à DataGridComboBoxColumn de la collection

XAML:

<toolkit:DataGrid Name="dgPeoples"/> 

CS:

namespace DataGrid 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 
    { 
     private readonly ObservableCollection<Person> personList = new ObservableCollection<Person>(); 

     public Window1() 
     { 
      InitializeComponent(); 

      personList.Add(new Person("George", "Jung")); 
      personList.Add(new Person("Jim", "Jefferson")); 
      personList.Add(new Person("Amy", "Smith")); 

      dgPeoples.ItemsSource = personList; 
     } 
    } 
} 

unnessecary probablement, mais ici est la classe de la personne:

namespace DataGrid 
{ 
    public class Person 
    { 
     public string fName { get; set; } 
     public string lName { get; set; } 

     public Person(string firstName, string lastName) 
     { 
      fName = firstName; 
      lName = lastName; 
     } 
    } 
} 

Mais ce dont j'ai vraiment besoin c'est dans DataGridComboBoxColumn. Voici mes révisions:

XAML:

<toolkit:DataGrid Name="dgPeoples" Grid.Row="0" AutoGenerateColumns="False"> 
    <toolkit:DataGrid.Columns> 
     <toolkit:DataGridComboBoxColumn Width="5*"/> 
     <toolkit:DataGridComboBoxColumn Width="5*"/> 
    </toolkit:DataGrid.Columns> 
</toolkit:DataGrid> 

C#:

Stays même.

Problème Maintenant, c'est que j'obtiens des colonnes combobox vides! Des idées comment je peux obtenir ceci pour fonctionner? À long terme, j'ai besoin d'une liaison bidirectionnelle, où un double clic sur la colonne prénom affiche la boîte de dialogue qui contient alors les options de tous les prénoms possibles dans la collection (à savoir George, Jim et Amy).

Grateful toute aide!

+0

Je suspecte de lire ceci: http: // blogs.msdn.com/vinsibal/archive/2008/10/31/wpf-datagrid-datagridcomboboxcolumn-v1-intro.aspx est l'endroit où le problème se pose. J'ai besoin de définir SelectedItemBinding dans le XAML, mais puisque ma liste est définie dans le code, comment puis-je faire cela? Non, je ne veux pas le mettre en XAML, car une autre partie de cette application permet d'ajouter des objets people, donc la liste change constamment. – baron

Répondre

1

Je voulais juste vous indiquer une des meilleures références en matière de la boîte à outils WPF DataGrid, il vient de from Samuel Moura je téléchargé les 15 échantillons et gardez-les à portée de main, je vous donne le lien parce que vous trouverez la série de post Datagrid plus utile que toute référence que je peux vous donner comme réponse rapide

+0

@Enrique: Votre question XamlWriter a été supprimée avant que je puisse y répondre. Vous avez probablement trouvé que le problème était que Concept (évidemment un objet DataModel ou Data) avait un pointeur sur UserControl, donc vous avez fini par essayer de sérialiser un cycle. J'allais le mentionner mais je voulais aussi mentionner que le fait que vous ayez un champ "ConceptAnswerUserControl" dans votre objet "Concept" me dit que vos couches de données et d'interface utilisateur sont mal séparées. Vos données (ou ViewModel) ne doivent jamais avoir un pointeur vers un UIElement de quelque nature que ce soit. Cela conduit à toutes sortes de problèmes. (suite ...) –

+0

(suite) Par exemple, que se passerait-il si vous vouliez afficher et éditer le même Concept à deux endroits - il y aurait alors deux UserControls pour votre Concept. Je vous recommande fortement de revenir en arrière et de repenser la manière dont vous avez architecturé votre couche de données (ou modèle de vue) et l'interface utilisateur qui y est liée. Déterminez comment empêcher la couche de données de référencer l'interface utilisateur et vous obtiendrez une meilleure conception. –

+0

@Ray Burns En fait, j'ai toujours le problème, Concept est pure données et, ne contient aucune référence à l'interface utilisateur; dans ConceptAnswerUserControl, nous voulons stocker une sorte de métadonnées qui indique au client comment se comportera le rendu visuel de "concept", en créant un "concept" dont l'auteur (business people) peut choisir comment le rendre, par exemple ConceptAnswerUserControl.ConceptAnswerType pourrait être un "YesNo" ou un "Text_Single" "Text_Multiple", de toute façon, tout ce qui est encore en développement et en exploration approche l'un d'entre eux - le rendu WFF - est l'endroit où j'ai cette erreur. –

1

Le DataGrid doit avoir les propriétés Header et ItemsSource fixés:

<toolkit:DataGrid Name="dgPeoples" Grid.Row="0" AutoGenerateColumns="False"> 
    <toolkit:DataGrid.Columns> 
     <toolkit:DataGridComboBoxColumn Width="5*" 
      Header="First Name" 
      ItemsSource="{Binding Path=fName}"/> 
     <toolkit:DataGridComboBoxColumn Width="5*" 
      Header="First Name" 
      ItemsSource="{Binding Path=lName}"/> 
    </toolkit:DataGrid.Columns> 
</toolkit:DataGrid> 

Il semble y avoir eu en cause dans l'une des versions de la boîte à outils lors de l'utilisation du DataGridComboBoxColumn.ItemsSource: DataGridComboBoxColumn.ItemsSource doesn't work.

Cependant, une solution de contournement a été créée pour Using combo boxes with the WPF DataGrid. Enfin, vous pouvez jeter un oeil à l'article More fun with DataGrid par Margaret Parsons ainsi.

Modifier
Maintenant, je ne suis pas sûr que le code ci-dessus fonctionne. Je l'ai fait de mémoire et référencé les autres liens comme ressources.

Jetez un oeil à ce SO poste qui semble résoudre ce problème: Problem binding DataGridComboBoxColumn.ItemsSource

+0

Cela ne fonctionne pas. Je reçois la même chose qu'avant, sauf évidemment qu'ils ont maintenant des en-têtes. C'est le nombre correct de lignes, mais vide, et le double-clic fait apparaître le comobobox, mais c'est aussi vide. – baron

+0

Voir la modification pour référence à un autre message SO qui devrait résoudre le problème. –

+0

Pouvez-vous m'aider à montrer comment j'adapterais mon problème à la solution dans cette question SO? Parce que j'ai placé ItemsSource dans le code derrière, il le fait dans xaml – baron