Использование общих аргументов в окне WPF, определенном в XAML - PullRequest
8 голосов
/ 15 июля 2010

Я пытаюсь создать производный от Window класс в XAML, который может принимать универсальный аргумент, но я не могу определить общий аргумент в XAML, чтобы он генерировал частичный класс, соответствующий моему файлу с выделенным кодом .

То, что я пытаюсь выполнить, - это замена всех вызовов MessageBox для того, чтобы задавать пользовательские вопросы, где я могу давать значимые заголовки кнопок («Сохранить и выйти» / «Выйти без сохранения» / «Не выйти» типа вещь). Я хотел бы иметь возможность передать окну универсальный аргумент, ограниченный System.Enum, определяющий возвращаемое значение для выбранной опции:

<Window x:Class="EvilPenguin.MultipleChoiceQuestionBox">
    ...

public partial class MultipleChoiceQuestionBox<T> : Window where T : System.Enum
{
    public MultipleChoiceQuestionBox()
    {
        InitializeComponent();
    }

    public T SelectedOption
    {
        get;
    }
}
  • Есть ли способ заставить мой XAML генерировать частичный класс с правильным универсальным аргументом?
  • Я «делаю это неправильно»? По какой-то причине это плохая идея или есть более простой способ?
  • Разве это невозможно в XAML на данный момент? Атрибут x: TypeArgument не совсем делает то, что я хочу, но он предполагает, что по крайней мере некоторые аспекты XAML знают об универсальных аргументах

Любая помощь или советы приветствуются

Ответы [ 3 ]

7 голосов
/ 15 июля 2010

Вы не можете сделать это.Вот мой ответ на аналогичный вопрос SO :

Нет, вы не можете объявить универсальный тип в XAML.С http://social.msdn.microsoft.com/forums/en-US/wpf/thread/02ca0499-80af-4c56-bb80-f1185a619a9e:

Здравствуйте, вы можете использовать generic, если вы не используете XAML.Но, к сожалению, если вы хотите использовать XAML для определения своего элемента управления, вы не можете использовать универсальный ...

Вы можете создать элемент управления в XAML, который наследует от универсального типа, поставив x:TypeArguments атрибут корневого тега, но сам элемент управления должен быть конкретным.

3 голосов
/ 15 июля 2010

Я не эксперт по XAML, но быстрый поиск в Google "generics in XAML markup" привел меня к этой статье MSDN: http://msdn.microsoft.com/en-us/library/ee956431.aspx

Похоже, вы действительно можете использовать generics вXAML.Посмотрите, подходит ли это вашему сценарию.

<my:BusinessObject x:TypeArguments="x:String,x:Int32"/>
2 голосов
/ 15 июля 2010

Попробуйте использовать x:Subclass и сделайте подкласс универсальным. Это позволяет разрабатывать базовый класс (и загружать XAML), а производный использовать универсальный тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...