La liaison à DataContext en dehors des ItemsSource contexte
J'ai un DataSet
lié à la Window.DataContext
; j'ai aussi un DataGrid
:
<DataGrid ItemsSource={Binding Tables[Items]}>
<DataGrid.Columns>
<DataGridTextBoxColumn Header={Binding Path=DataContext.Tables[Names]/Test, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}} />
</DataGrid.Columns>
</DataGrid>
En gros, je suis en train de lier l'en-Tête de cette colonne à la DataTable "Noms", la Colonne "Test", la première rangée.
Cependant, je ne peux pas obtenir de droit. Notez que je peux lier amende à l'extérieur de la grille de données. La Grille de l'ItemsSource changements du contexte de données et je ne sais pas comment faire référence à l'extérieur de l'original DataContext.
Il semble que la liaison réussit; mais le problème est que l'élément actuel (première ligne) de la Tables de[Nom] dans la Fenêtre.DataContext suis perdu.
Si je fais le jeu de données statiques et d'y accéder via {x:Static locale:dataset}, alors les choses fonctionnent bien. Mais je ne peux pas utiliser des ensembles de données parce qu'il y aura plusieurs instances (multi-utilisateur).
Quelqu'un peut-il svp me pointer dans la bonne direction?
OriginalL'auteur vuduy | 2010-10-13
Vous devez vous connecter pour publier un commentaire.
Je suis assez sûr que vous pourriez faire ce que vous essayez de le faire en utilisant
RelativeSource
de liaison.J'ai fait un rapide exemple: http://bitbucket.org/claus/wpf-bindingoutsidedatacontext
Il permet de vous lier à la Fenêtre parent, qui dans mon cas a le viewmodel datacontext (avec le SomethingOutsideDataContext bien sur).
Vous devez être conscient que, cela fonctionnera seulement avec WPF et pas Silverlight - le "FindAncestor, AncestorType' la substance n'a pas été mis en œuvre dans Silverlight encore... je ne sais pas si il y a une autre méthode, en plus d'utiliser les ressources statiques.
Assurez-vous également que votre ancêtre type est un type de
Window
et non un type deUserControl
comme leDataContext
propriété présenteranull
Quand je fais cette chose exacte (mais je lier
Visibility
au lieu de cela), j'obtiens:System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.DockPanel', AncestorLevel='1''. BindingExpression:Path=DataContext.IsFileMode; DataItem=null; target element is 'DataGridTextColumn' (HashCode=16991479); target property is 'Visibility' (type 'Visibility')
. Actuellement je les traiter avec le Code-behind.OriginalL'auteur Claus
Ne sais pas si cela fonctionne pour votre situation, mais vous pouvez essayer quelque chose comme ceci:
1) Donner à votre Fenêtre un Nom d'attribut, par exemple le Nom=ZeWindow.
2) Lier votre
DataGridTextBoxColumn
en-Tête comme ceci:Donc, en gros, au lieu de se lier à la
DataContext
de laDataGrid
, vous pouvez lier à laDataContext
de laUIElement
avec Nom=ZeWindow.P. S.: je suis assez nouveau à WPF, donc cela peut ne pas fonctionner avec la Fenêtre, mais j'ai fait quelque chose de similaire à l'aide de UserControls
Ok, je vois, alors je suis désolé mais je ne sais pas quel pourrait être le problème. J'espère que quelqu'un d'autre le fera savoir
OriginalL'auteur Gilles Radrizzi
C'est le comportement attendu en fait: La
DataContex
t pourDataGridCell
est le entireRow.donc, vous avez 3 solutions:
soit vous ajoutez votre liaison dans le code derrière comme ceci:
dans chaque Colonne Constructeur:
(vous devez trouver un moyen d'obtenir le "thisColumnIndex". Pour autant que je suis concerné, j'ai ajouter les colonnes à droite après je les créer, si j'ai simplement mis "dataGridOwner.Les colonnes.Count").
ou...
vous pouvez trouver un moyen d'obtenir le dataContext vous souhaitez sur chaque cellule (essayé, mais il bousille mal lors de la colonne/ligne de virtualisation est sur)
ou...
jeter un coup d'oeil:
La liaison d'une cellule de propriété de l'objet à un DataGridCell en WPF DataGrid
Personnellement, je trouve le premier à être le mieux pour mon usage (depuis que j'ai ajouter mes colonnes dans le code behind de toute façon), mais c'est vraiment à vous en fin de compte...
Autant que columnHeaders sont concernés (et seulement columnsHeaders, pas de lignes), vous pouvez également explorer les "DataTemplate ğ:
définir les colonnes d'en-tête de la Colonne elle-même (de cette façon, vous définissez la colonne comme DataContext pour l'en-tête) et l'utilisation d'un DataTemplate.
par exemple:
dans chaque colonne de la classe:
et dans votre grille de données du xaml, quelque chose comme:
bien sûr, mon "MyDataGridColumnHeader" classe contient les définitions pour toutes les propriétés citées ici.
espère que cette aide.
OriginalL'auteur David