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