我有一個使用ContentTemplate
進行樣式設置的ContentControl
窗口。列表框中的WPF(XAML)綁定項目模板
ContentTemplate
包含嵌套在Grid
內的簡單ListBox
。 Grid使用代碼設置DataContext
屬性集(綁定到CollectionViewSource
- 讓我們稱之爲cvs1)。列表框ItemsSource
繼承自網格,列表框項目的人口工作正常。例如
<Grid x:Name="Grid1">
<ListBox x:Name="ListBox1" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True"/>
</Grid>
ListBox正在設計樣式中,主樣式存儲在ResourceDictionary中。
我使用ItemTemplate
設置列表框的樣式值,但我還希望使用DataTrigger
來動態應用不同的Setter。我面臨的挑戰是我似乎無法將DataTrigger中的Binding建立到單獨的CollectionViewSource(我們稱之爲cvs2)。
<Style TargetType="{x:Type ListBox}">
<Style.Triggers>
<!-- This seems to be trying to bind to cvs1, the error is it can't find the property -->
<DataTrigger Binding="{Binding cvs2, Path=TemplateName}" Value="ABC">
<Setter Property="ItemTemplate">
</DataTrigger>
<!-- This just doesn't seem to work -->
<DataTrigger Binding="{Binding Source={StaticResource cvs2},Path=TemplateName}" Value="XYZ">
<Setter Property="ItemTemplate">
</DataTrigger>
</Style.Triggers>
</Style>
cvs1和cvs2都在ResourceDictionary
中定義。
<CollectionViewSource x:Key="cvs1" />
<CollectionViewSource x:Key="cvs2" />
然後爲引用如下:
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="DataSources.xaml" />
</ResourceDictionary.MergedDictionaries>
這個問題我似乎面對的是ItemTemplate
從列表框繼承的DataContext,我似乎無法克服這個問題,建立綁定到cvs2數據源。我認爲這將是一個相當常規的StaticResource
綁定任務。似乎並非如此。
我已經測試了下面的代碼在網格外的標籤(在主窗口)來調試數據:
<Label Content="{Binding cvs2, Path=/TemplateName}"/>
該工程中,標籤被填充有TEMPLATENAME的值。
但是,如果我在ItemsTemplate
內的DataTrigger
上使用此項,則綁定不成立。
如何從ItemTemplate
內建立對cvs2的綁定?