0

我有一个标记扩展

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>

问题是:是否可以避免“GUI:DataTemplates”元素编写一些 TypeConverter 或其他方式?

谢谢!

更新:我找到了MSDN 文章,它指出我的示例应该在没有“GUI:DataTemplates”的情况下工作得很好,但它没有:(互联网上的许多文章也一样。我做错了什么?

4

1 回答 1

0

问题是您使用的 Dictionary 会让您陷入两个相互冲突的要求之间。<GUI:DataTemplates>您删除了代码的一些关键部分,所以我只是猜测还有什么,但是使用分解语法x:Key(字典中的键。

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

如果您可以切换到使用普通集合而不是字典并根据索引或类似的东西进行选择,您将能够去除额外的元素,但考虑到您尝试删除的 XAML 数量最少,我只想忍受它。

于 2013-03-15T16:08:02.713 回答