我有一個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