从xaml填充集合属性,没有指定属性元素

时间:2013-03-15 11:05:34

标签: wpf xaml datatemplateselector

我有一个MarkupExtension

public class DataTemplates : Dictionary<object, DataTemplate>{}

[MarkupExtensionReturnType(typeof(DataTemplateSelector))]
[ContentProperty("DataTemplatesDictionary")]
public class TemplateSelectorExtension : MarkupExtension
{
  //...
  public DataTemplates DataTemplatesDictionary { get; set; }

  public override object ProvideValue(IServiceProvider serviceProvider)
  {
    if (DataTemplatesDictionary == null) throw new ArgumentException();
    // some logic
  }
}

在xaml中使用

<TabControl.ItemTemplateSelector>
  <GUI:TemplateSelector>
    <GUI:DataTemplates> <!-- How do I avoid this element???-->

      <DataTemplate ....>
      </DataTemplate>
      <DataTemplate ....>
      </DataTemplate>

    </GUI:DataTemplates>
  </GUI:TemplateSelector>
</TabControl.ItemTemplateSelector>

问题是:是否有可能避免&#34; GUI:DataTemplates&#34;元素写一些TypeConverter或其他什么?

谢谢!

更新:我找到了MSDN article,它说明我的示例应该没有&#34; GUI:DataTemplates&#34;好吧,但它没有:( 互联网上的许多文章都是相同的。我做错了什么?

1 个答案:

答案 0 :(得分:0)

问题是你正在使用一个字典,它会让你陷入两个相互矛盾的要求之间。你删除了代码的一些关键部分,所以我只是猜测还有什么,但是使用爆炸语法(<GUI:DataTemplates>)你明确地在XAML中设置了Dictionary,这样你就可以分配{{1每个属性都用作字典中的键。

虽然仍然需要为每个字典项指定一个键,但是回退到ContentProperty用法,但是XAML不允许您在字典之外声明x:Key并且无法识别由字典项使用的隐式字符。的MarkupExtension。您也不能完全关闭DataTemplate键,因为Dictionary没有键。在这种情况下你可以使用x:Key属性,但由于你每个类型只能有一个属性,你最好不要使用选择器,只需将它们放在TabControl的资源中,让隐式输入自动处理模板

如果您可以切换到使用普通集合而不是字典并根据索引或类似的东西进行选择,那么您将能够去掉额外的元素但是给出了最小量的XAML,您试图删除我只是和它一起生活。