0

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>

問題は、「GUI:DataTemplates」要素が TypeConverter またはその他の方法で記述されないようにすることは可能ですか?

ありがとう!

更新: MSDN の記事を見つけました。私の例は "GUI:DataTemplates" がなくてもうまく動作するはずですが、そうではありません:(インターネットの多くの記事でも同じことが述べられています。何が間違っていますか?

4

1 に答える 1

0

問題は、相反する 2 つの要件の間で動けなくなる Dictionary を使用していることです。コードのいくつかの重要な部分を削除したので、他に何があるかを推測していますが、展開された構文 ( <GUI:DataTemplates>) を使用して、XAML で辞書を明示的に設定しているためx:Key、それぞれに属性を割り当てて、辞書のキー。

各ディクショナリ項目にキーを割り当てる必要はありますが、ContentProperty の使用法にフォールバックしますが、XAML ではx:Keyディクショナリの外部で宣言できず、MarkupExtension で使用される暗黙的なものを識別できません。Dictionary にはキーがないため、DataTemplate キーを完全にオフのままにすることもできません。この場合、属性を使用できますDataTypeが、タイプごとに 1 つしか持つことができないため、セレクターをまったく使用せずに、TabControl のリソースにそれらを配置し、暗黙的な型付けでテンプレートを自動的に処理できるようにする方がよいでしょう。

ディクショナリの代わりに通常のコレクションを使用するように切り替えて、インデックスなどに基づいて選択を行うことができれば、余分な要素を取り除くことができますが、削除しようとしている XAML の量が最小限であれば、それと一緒に暮らす。

于 2013-03-15T16:08:02.713 に答える