我有一个ListBox
绑定到ViewModel上的子集合。从DataTemplate访问父DataContext
<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>
我得到以下输出错误:
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')
所以,如果我改变了绑定表达式"Path=DataContext.CurrentItem.CurveSpeedMustBeSpecified"
它的工作列表框项目在一个DataTemplate基于父视图模型的属性风格但是只要父级用户控件的datacontext是BindingListCollectionView
。这是不可接受的,因为用户控件的其余部分会自动绑定到BindingList
上的CurrentItem
的属性。
如何在样式中指定绑定表达式,以便它可以工作,而不管父数据上下文是集合视图还是单个项目?
我在我的项目中有这个确切的代码,但它泄漏ViewModels(终结者未调用,命令绑定似乎保留DataContext)。你能证实这个问题也存在吗? – 2013-01-22 11:05:21
@Juve这个作品,但它可能做到这一点,以便它会触发实现相同模板的所有itemscontrol?名称是独一无二的,所以我们需要为每个模板分别设置一个模板,除非我错过了一些东西。 – Chris 2014-11-03 17:53:35
@Juve无视我的最后一个,我通过使用relativeanceource和findancestor并通过祖先类型进行搜索(除非不按名称搜索,所有这些都一样)。在我的情况下,我重复使用ItemsControls每一个实现模板,所以我看起来像这样:Command =“{Binding RelativeSource = {RelativeSource FindAncestor,AncestorType = {x:Type ItemsControl}},Path = DataContext.OpenDocumentBtnCommand}” – Chris 2014-11-03 18:15:17