L'accès parent DataContext de DataTemplate
J'ai un ListBox
qui se lie à un enfant de la collection sur un ViewModel. La liste des éléments sont décorées dans un datatemplate basée sur une propriété sur le parent ViewModel:
<Style x:Key="curveSpeedNonConstantParameterCell">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=DataContext.CurveSpeedMustBeSpecified,
ElementName=someParentElementWithReferenceToRootDataContext}"
Value="True">
<Setter Property="Control.Visibility" Value="Hidden"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
J'obtient l'erreur de sortie:
System.Windows.Data Error: 39 : BindingExpression path error:
'CurveSpeedMustBeSpecified' property not found on
'object' ''BindingListCollectionView' (HashCode=20467555)'.
BindingExpression:Path=DataContext.CurveSpeedMustBeSpecified;
DataItem='Grid' (Name='nonConstantCurveParametersGrid');
target element is 'TextBox' (Name='');
target property is 'NoTarget' (type 'Object')
Donc si je change l'expression de liaison de "Path=DataContext.CurrentItem.CurveSpeedMustBeSpecified"
cela fonctionne, mais seulement aussi longtemps que le datacontext de la mère de contrôle de l'utilisateur est un BindingListCollectionView
. Ce n'est pas acceptable, car le reste de l'utilisateur le contrôle se lie aux propriétés de la CurrentItem
sur le BindingList
automatiquement.
Comment puis-je spécifier une expression de liaison de l'intérieur le style de sorte qu'il fonctionne quel que soit le parent contexte de données vue d'une collection ou d'un seul élément?
Vous devez vous connecter pour publier un commentaire.
J'ai eu des problèmes avec la source par rapport à Silverlight. Après la recherche et la lecture je n'ai pas trouver une solution adaptée sans aide supplémentaire bibliothèque de Liaison. Mais, ici, c'est une autre approche pour l'obtention de l'accès à la société mère DataContext en faisant directement référence à un élément de qui vous savez le contexte de données. Il utilise
Binding ElementName
et fonctionne très bien, aussi longtemps que vous respectez votre propre dénomination et n'ont pas lourd réutilisation detemplates
/styles
à travers des composants:Cela fonctionne aussi si vous mettez le bouton en
Style
/Template
:Au début, je pensais que le
x:Names
des éléments parents ne sont pas accessibles à partir d'un élément basé sur un modèle, mais depuis je n'ai pas trouvé de meilleure solution, je l'ai juste essayé, et il fonctionne très bien.Vous pouvez utiliser
RelativeSource
pour trouver l'élément parent, comme ce -Voir cette SORTE de question pour plus de détails sur
RelativeSource
.Mode=FindAncestor
pour que ça fonctionne, mais ça fonctionne et est bien mieux dans un MVVM scénario, car il évite de nommage des contrôles.Binding="{Binding Path=DataContext.CurveSpeedMustBeSpecified, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:YourParentElementType}}}"
RelativeSource vs ElementName
Ces deux approches, on peut obtenir le même résultat,
RelativeSrouce
Cette méthode semble pour un contrôle d'un type de Fenêtre (dans cet exemple) dans l'arborescence visuelle et quand il en trouve fondamentalement, vous pouvez accéder à ses
DataContext
à l'aide de laPath=DataContext....
. Les avantages de cette méthode est que vous n'avez pas besoin d'être lié à un nom et c'est une sorte de dynamique, toutefois, les modifications apportées à votre arborescence visuelle peuvent affecter cette méthode et, éventuellement, de le casser.ElementName
Cette méthode renvoie à une solide statique
Name
tant et aussi longtemps que votre champ d'application de la voir, vous êtes beaux.Vous devriez coller à votre convention d'affectation de noms pour ne pas casser cette méthode de cours.L'approche est qute simple et tout ce que vous besoin de faire est de spécifier unName="..."
pour votre Fenêtre/UserControl.Bien que tous les trois types (
RelativeSource, Source, ElementName
) sont capables de faire la même chose, mais selon l'article MSDN suivant, chacun de mieux être utilisées dans leur propre domaine de spécialité.Comment: Spécifier la Source de Liaison
Trouver une brève description de chacun, plus un lien vers plus de détails dans le tableau en bas de la page.
Je cherchais comment faire quelque chose de similaire dans WPF et j'ai eu cette solution:
J'espère que cela fonctionne pour quelqu'un d'autre. J'ai un contexte de données qui est configuré automatiquement à la ItemsControls, et ce contexte de données a deux propriétés:
MyItems
-qui est un de la collection, et une commande 'CustomCommand'. En raison de laItemTemplate
est à l'aide d'unDataTemplate
, leDataContext
de niveaux supérieurs n'est pas directement accessible. Ensuite, la solution de contournement pour obtenir le DC du parent est d'utiliser un chemin relatif et filtrer parItemsControl
type.le problème est que d'un DataTemplate n'est pas une partie d'un élément de sa appliquée.
cela signifie que si vous liez le modèle que vous êtes en se liant à quelque chose qui n'a pas de contexte.
toutefois, si vous placez un élément à l'intérieur du modèle puis, quand cet élément est appliqué à la mère, elle gagne un contexte et de la liaison fonctionne alors
donc cela ne fonctionnera pas
mais cela fonctionne parfaitement
parce que, après le datatemplate est appliqué à la zone de groupe est placé dans le parent et avoir accès à son Contexte
de sorte que tous vous avez à faire est de supprimer le style du modèle et de le déplacer dans un élément dans le modèle
note que le contexte pour un itemscontrol est l'élément le contrôle
ie ComboBoxItem pour ComboBox pas la zone de liste déroulante dans ce cas, vous devez utiliser les commandes ItemContainerStyle au lieu