ItemsSource vs DataContext dans la liaison de cas
Ma principale question est à propos de la liaison de cas dans la scène que nous avons de multiples sources pour un contrôle(un combobox à l'intérieur d'une grille de données)(ou à la fois d'datacontext et itemssource). Alors, comment pouvons-nous savoir qui de la source de la liaison va utiliser? (toute la syntaxe de préciser que)
En supposant un datagrid a un itemssource="Liste des Joueurs" datacontext="Manager"
et dispose d'une zone de liste déroulante comme une sorte de colonne. Nous supposons également que chaque joueur dispose d'un Inventaire de la propriété qui est un type de collection.
puis à l'intérieur de la grille de données.colonnes:
- La source de courant de chaque colonne(pour la liaison) est un Joueur(c'est comme ça que je comprends à ce jour). Nous ne pouvons lier à la propriété du joueur de ne pas la propriété de la datacontext "manager". Il n'y a aucun moyen de se lier à la propriété de la "Manager". Suis-je la corriger?
- Cependant, si nous passons à la zone de liste déroulante colonnes, puis d'assumer, je vais laisser du composant combobox itemssource ='joueur 'inventaire', alors la source de courant pour comboboxItem sera chaque élément de l'inventaire. Et si j'utilise la liaison, il ne peut se lier à la propriété de ces éléments.
Cependant, parfois, je vois le code que l'on peut également se lier à la propriété du joueur à l'intérieur de la zone de liste déroulante du bien, en particulier en Valeur Sélectionnée et SelectedItem. Je suis un peu confus ici
pouvez-vous m'aider?
merci
OriginalL'auteur Tai | 2010-08-19
Vous devez vous connecter pour publier un commentaire.
La clé de contrôle à penser est un
ItemsControl
(ComboBox
hérite deItemsControl
et laDataGrid
très similaire).Un
ItemsControl
aItemsSource
propriété de typeIEnumerable
. Il a également laItemTemplate
de la propriété. Ce qu'il va faire est créer une copie duItemTemplate
pour chaque élément deItemsSource
. LeDataContext
de laItemTemplate
sera chaque élément dans laItemsSource
.Dans votre cas, de la
ComboBox
, leDataContext
de laDataGrid
's de la colonne sera votrePlayer
objet. Si vous liez leComboBox
'sItemSource
à unPlayer
'inventaire, puis vous obtiendrez chaque élément dans votreComboBox
la liste.La chose à noter est que le
DataContext
de laComboBox
lui-même reste inchangé. C'est toujours laPlayer
objet. Si vous spécifiez unItemTemplate
pour votreComboBox
, qu'est ce que c'estDataContext
pour les éléments dans unPlayer
'inventaire.OriginalL'auteur Stephan
Son vraiment simple.
DataContext se réfère à la même propriété de la éléments. Il n'a pas obtenir de l'étendue et de ses dynamiques. DataContext s'applique aux enfants de propriétés qui sont actuellement à l'intérieur de la mère.
Mais ItemsSource est dynamique. Il est agrandi avec la source. Voici une gud exemple.
Ceci est un exemple de xaml.
Voici le code derrière.
Comme vous pouvez le voir, le DataContext s'applique à la Textblocks qui existent dans le StackPanel et se référer à une seule propriété, qui est le Texte.
Alors que ItemsSource se réfère à la Source de l'Image et à la propriété Text du Textblock et les éléments à l'intérieur de la liste peut être étendue avec l'ObservableCollection.
Ou pour le rendre encore plus simple pour vous.
DataContext - Valeur est définie sur la base du design.
ItemsSource - Valeur est basée sur la logique.
Espère que cette aide.
Marque de cette réponse, si cela répond à votre question.
C'est la même chose. Si vous avez une listbox avec 2 textblocks comme je l'ai dit dans l'exemple. Vous pouvez utiliser le DataContext de la liaison de données. Dans le cas où il dispose de différents contrôles que ses enfants, puis à l'aide ItemsSource serait la meilleure option. Les deux sont de la liaison de données phénomène utilisé dans différents scénarios.
OriginalL'auteur Aswin Ramakrishnan