我有两个datatemplates定义为静态资源。现在我有一个组合框与每个名称。是否可以将控件利用这些staticresources作为itemtemplates绑定到组合框中所选静态资源的名称?
提前致谢。
答案 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
。我们现在可以在ContentTemplate
或ItemTemplate
属性上使用元素到元素绑定。
如果您还需要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>