J'ai un ListBox
qui se lie à une collection enfant sur un ViewModel. Les éléments de ListBox sont décorées dans un DataTemplate basé sur une propriété sur la ViewModel mère:Accès parent DataContext à partir de DataTemplate
<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'obtiens l'erreur de sortie suivante:
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 la l'expression de liaison à "Path=DataContext.CurrentItem.CurveSpeedMustBeSpecified"
il fonctionne , mais seulement tant que le datacontext du contrôle utilisateur parent est BindingListCollectionView
. Ceci n'est pas acceptable car le reste du contrôle utilisateur se lie automatiquement aux propriétés du CurrentItem
sur le BindingList
.
Comment puis-je spécifier l'expression de liaison dans le style afin qu'elle fonctionne indépendamment du contexte de données parent qui est une vue de collection ou un élément unique?
J'ai ce code exact dans mon projet mais il fuit ViewModels (Finalizer n'est pas appelé, Command binding semble conserver DataContext). Pouvez-vous vérifier que ce problème existe aussi pour vous? –
@Juve cela fonctionne, mais est-il possible de le faire afin qu'il se déclenche pour tous les itemscontrols qui implémentent le même modèle? Le nom est unique, alors nous aurions besoin d'un modèle distinct pour chacun, à moins que je ne manque quelque chose. – Chris
@Juve ne pas tenir compte de mon dernier, je l'ai eu à travailler en utilisant la source de la famille avec findancestor et la recherche par ancestortype, (donc tout de même, sauf recherche par nom). Dans mon cas, je répète l'utilisation de ItemsControls chacun implémentant un template pour que le mien ressemble à ceci: Command = "{Liative RelativeSource = {RelativeSource FindAncestor, AncestorType = {x: Type ItemsControl}}, Path = DataContext.OpenDocumentBtnCommand}" – Chris