0

我有一个ContentControl使用ContentTemplate.

ContentTemplate包含一个简单的嵌套ListBox在 aGrid中。网格具有DataContext使用代码设置的属性(绑定到CollectionViewSource- 我们称之为 cvs1)。ListBoxItemsSource继承自 Grid 并且 ListBox 项的填充工作正常。例如

<Grid x:Name="Grid1">
    <ListBox x:Name="ListBox1" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True"/>
</Grid>

ListBox 正在设置样式,主要样式存储在 ResourceDictionary 中。

我正在使用 a 为 ListBox 设置样式值ItemTemplate,但我还想要使用 aDataTrigger来动态应用不同的 Setter。我面临的挑战是我似乎无法在 DataTrigger(s) 中建立绑定到单独的 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 都在 a 中定义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}"/>

这行得通,标签填充了 TemplateName 的值。

但是,如果我在DataTrigger内部使用这个ItemsTemplate,绑定就不会建立。

如何从 ? 中建立到 cvs2 的绑定ItemTemplate

4

1 回答 1

0

我是 silverlight 开发人员,我只是在绑定上使用转换器来实现这些类型目标。

但是我喜欢 Xaml,并且根据您的 cvs2 对象的 TemplateName 属性,我从您的 xaml 中了解到您想要更改 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 的数据上下文中搜索它。

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

于 2013-02-17T13:25:04.883 回答