Silverlight:将StaticResource名称绑定到组合框

时间:2011-08-02 14:21:13

标签: silverlight data-binding

我有两个datatemplates定义为静态资源。现在我有一个组合框与每个名称。是否可以将控件利用这些staticresources作为itemtemplates绑定到组合框中所选静态资源的名称?

提前致谢。

1 个答案:

答案 0 :(得分:0)

这是一些看起来非常疯狂但效果相当不错的东西。

<Grid x:Name="LayoutRoot">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <ComboBox x:Name="cboTemplate" DisplayMemberPath="Key" SelectedValuePath="Key" SelectedValue="Blue">
        <ComboBox.ItemsSource>
            <ResourceDictionary>
                <DataTemplate x:Key="Blue">
                    <TextBlock Foreground="Blue" Text="{Binding}" />
                </DataTemplate>
                <DataTemplate x:Key="Red">
                    <TextBlock Foreground="Red" Text="{Binding}" />
                </DataTemplate>
            </ResourceDictionary>
        </ComboBox.ItemsSource>
    </ComboBox>
    <ContentPresenter Grid.Row="1" Content="Hello World" ContentTemplate="{Binding SelectedItem.Value, ElementName=cboTemplate}" />
</Grid>

资源字典是KeyValuePair<object, object>的集合,除了Xaml解析之外,还使用x:Key属性填充它。因此,此ComboBox显示Key属性,但其SelectedItem将是KeyValuePair<object, object>,其Value属性是我们想要的DataTemplate。我们现在可以在ContentTemplateItemTemplate属性上使用元素到元素绑定。

如果您还需要DataTemplates作为静态资源,并且您希望避免代码重复,则可以将它们放在单独的资源字典xaml文件中。然后,您可以使用: -

        <ComboBox.ItemsSource>
            <ResourceDictionary Source="DataTemplateResources.xaml" />
        </ComboBox.ItemsSource>

除了将它们包含在静态资源中,例如: -

 <UserControl.Resources>
     <ResourceDictionary>
          <ResourceDictionary.MergedDictionaries>
               <ResourceDictionary Source="DataTemplateResources.xaml" />
          </ResourceDictionary.MergedDictionaries>
          <!-- other resources here -->
     </ResourceDictionary>
 </UserControl.Resources>