К сожалению, то, что вы хотите, не вполне невозможно.
Обновление: До .NET 4.0 (т.е. когда этот ответ был изначально написан), Поддержка XAML для использования универсальных типов была очень ограниченной ; например дженерики работали только с корневым элементом. В .NET 4.0 некоторые ограничения были сняты.
В .NET 4.0 вы можете создать полностью специализированный универсальный тип. Таким образом, хотя сам XAML по-прежнему не имеет понятия универсальных типов, он может ссылаться на специализации универсальных типов. (По аналогии, XAML не может выразить понятие List<>
, но может выразить понятие List<int>
). Подробнее см. На странице MSDN «Общие сведения в XAML» .
Вы можете создавать экземпляры специализированных универсальных типов с помощью директивы x:TypeArguments
. Например, если x
привязано к пространству имен XAML, sys
к пространству имен System
и scg
к System.Collections.Generic
, а ваше собственное пространство имен MyWindows ограничено my
, то:
<my:MyWindows x:TypeArguments="x:String">
создаст экземпляр MyWindows<string>
.
<scg:List x:TypeArguments="sys:Tuple(sys:String,sys:Int32)">
построит List<Tuple<string,int>>
Поэтому использование универсальных типов больше не является проблемой в XAML!
Увы, вы хотите определить универсальный тип в XAML. Это невозможно. Здесь есть два обходных пути. Во-первых (и основываясь на ваших комментариях к другому вопросу, я думаю, это то, что вы хотите), вы можете просто передать тип в качестве простого параметра. Если вы сделаете это, вы потеряете все функции безопасности во время компиляции, которые предоставляют дженерики, но достаточно часто они не актуальны. Во-вторых, вы можете определить обычный неуниверсальный класс с codebehind в XAML и просто использовать универсальный базовый класс для повторного использования кода. Таким образом вы получите хоть какую-то надлежащую безопасность и повторное использование дженериков.