Tengo un ListBox
que se une a una colección secundaria en un ViewModel. Los elementos de cuadro de lista están decoradas en un DataTemplate basado en una propiedad en el modelo de vista de los padres:Acceso principal DataContext 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>
me sale el siguiente mensaje de error de salida:
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')
Así que si cambio el la expresión de enlace a "Path=DataContext.CurrentItem.CurveSpeedMustBeSpecified"
funciona , pero solo mientras el contexto de datos del control de usuario principal sea BindingListCollectionView
. Esto no es aceptable porque el resto del control de usuario se vincula automáticamente a las propiedades del CurrentItem
en el BindingList
.
¿Cómo puedo especificar la expresión de enlace dentro del estilo para que funcione independientemente de que el contexto de datos padre sea una vista de colección o un solo elemento?
Tengo este código exacto en mi proyecto pero está perdiendo ViewModels (no se llama al Finalizer, el enlace del comando parece retener DataContext). ¿Puedes verificar que este problema existe para ti también? –
@Juve esto funciona, pero ¿es posible hacer esto para que se active para todos los controles de elementos que implementan la misma plantilla? El nombre es único, entonces necesitaríamos una plantilla separada para cada uno, a menos que me falta algo. – Chris
@Juve sin tener en cuenta mi último, lo tengo que trabajar mediante el uso de relativesource con findancestor y la búsqueda por ancestortype, (así todo lo mismo, excepto no buscar por nombre). En mi caso, repito el uso de ItemsControls cada uno implementando una plantilla para que el mío se vea así: Command = "{Binding RelativeSource = {RelativeSource FindAncestor, AncestorType = {x: Type ItemsControl}}, Path = DataContext.OpenDocumentBtnCommand}" – Chris