Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using generic arguments on WPF Window defined in XAML

I'm trying to create a Window-derived class in XAML which can take a generic argument, but I can't seem to define the generic argument in the XAML so that it generates the partial class matching my code-behind file.

What I'm trying to accomplish is a replacement for all the MessageBox calls for asking the user questions, where I can give meaningful button captions ('Save and quit'/'Quit without saving'/'Don't quit' type thing). I'd like to be able to pass the window a generic argument constrained to System.Enum defining the return value for the selected option:

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

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

    public T SelectedOption
    {
        get;
    }
}
  • Is there a way I can make my XAML generate a partial class with the correct generic argument?
  • Am I 'doing it wrong'? Is this a bad idea for some reason, or is there an easier way?
  • Is this not possible in XAML at the moment? The x:TypeArgument attribute doesn't quite do what I want, but it suggests that at least some aspects of XAML are aware of generic arguments

Any help or hints are much appreciated

like image 593
TheEvilPenguin Avatar asked Jul 15 '10 03:07

TheEvilPenguin


1 Answers

You can't do it. Here is my answer to this similar SO question:

No, you can't declare a generic type in XAML. From http://social.msdn.microsoft.com/forums/en-US/wpf/thread/02ca0499-80af-4c56-bb80-f1185a619a9e:

Hello, you can use generic as long as you don’t use XAML. But unfortunately, if you want to use XAML to define your control, you can’t use generic…

You can create a control in XAML that inherits from a generic type by putting a x:TypeArguments attribute on the root tag, but the control itself must be concrete.

like image 93
Quartermeister Avatar answered Oct 13 '22 01:10

Quartermeister