我有一个使用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的绑定?