WPF(XAML)在ListBox ItemTemplate中绑定

时间:2013-02-16 07:21:09

标签: wpf xaml binding

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

中建立与cvs2的绑定

1 个答案:

答案 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中搜索它。

我还没有回答,但希望能给你一个想法。