我有一个ContentControl
的窗口,使用ContentTemplate
设置样式。
ContentTemplate
包含嵌套在ListBox
内的简单Grid
。 Grid使用代码设置DataContext
属性(绑定到CollectionViewSource
- 让我们称之为cvs1)。 ListBox ItemsSource
继承自Grid,ListBox项的填充正常。 e.g。
<Grid x:Name="Grid1">
<ListBox x:Name="ListBox1" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True"/>
</Grid>
正在设置ListBox样式,主样式存储在ResourceDictionary中。
我正在使用ItemTemplate
为ListBox设置样式值,但我还想要使用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
是从ListBox继承DataContext而我似乎无法绕过这个来建立与cvs2数据源的绑定。我认为这将是一个相当常规的StaticResource
绑定任务。似乎并非如此。
我在网格外的标签中(在主窗口中)测试了以下代码来调试数据:
<Label Content="{Binding cvs2, Path=/TemplateName}"/>
这样,Label就会填充TemplateName的值。
但是,如果我在DataTrigger
内的ItemsTemplate
上使用此功能,则无法建立绑定。
如何在ItemTemplate
?
答案 0 :(得分:0)
我是一名银光开发人员,我只是在绑定上使用转换器来实现这些类型的目标。
但是我喜欢Xaml,正如我从你的xaml中理解的那样取决于你的cvs2对象的TemplateName属性你想改变ItemTemplate,不是吗?
如果是这样,为什么不给我们ItemTemplate属性的值?
<DataTrigger Binding="{Binding Source={StaticResource cvs2},
Path=TemplateName}" Value="XYZ">
<Setter Property="ItemTemplate">
<Setter.Value>
<TextBlock Text={Binding}/>
<Setter.Value>
</Setter>
</DataTrigger>
// When cvs2.TemplateName=XYZ use this template, isn't it?
cvs2首先作为此资源之前的资源加载吗?
输出是否有任何绑定错误?
您可以尝试使用特定的样式而不是x:Key隐式。
价值转换器可能对您有所帮助。
如果你使用StaticResource,它从key到底层到顶层,所以我认为它不会从ListBox的datacontext中搜索它。
我还没有回答,但希望能给你一个想法。