首页 文章

WPF(XAML)在ListBox ItemTemplate中绑定

提问于
浏览
0

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

  • 0

    我是一个Silverlight开发人员,我只是在绑定上使用转换器来实现这些类型的目标 .

    但是我喜欢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隐式 .

    Value 转换器可以帮助您 .

    如果你使用StaticResource,它从key到底层到顶层,所以我不认为它从ListBox的datacontext中搜索它 .

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

相关问题