views:

404

answers:

2

I've read this very related question here on SO, and it was extremely helpful because of the link in the answer. I'm just having a problem now going the extra step and making it all work with the MVVM pattern.

Let's say I have my ViewModel, and it (or even the Model) could have an enum defined:

public enum MyTypes { Type1, Type2, Type3 };

I want to databind this to a ComboBox in my GUI. According to the article, I would use an ObjectDataProvider to invoke the Enum.GetValues() method on MyTypes. So I have to pass MyTypes as a MethodParameter. But how do you pass the type? I've tried various methods, like adding the reference to the namespace in XAML:

    <Window.Resources>
        <ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type sys:Enum}" x:Key="TipHandlingValues">
            <ObjectDataProvider.MethodParameters>
                <!-- what goes here?  it's totally wrong. -->
                <my:MyTypes />
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </Window.Resources>

Pretty much nothing I put there will even compile. Does anyone know how to get past this little hurdle?

+3  A: 

Simplest way is to add this line in code:

DataContext = Enum.GetValues(typeof(MyTypes));

Other options is to add markup extension that produce list of values out of enum.

Andrey
That might be the simplest, but I don't think it's appropriate because my DataContext is my ViewModel, which is how I bind all of my commands and other comboboxes. I have a ton of other GUI elements than just the one combobox. As for the "other options", I thought the markup I posted in my question is how you produce the list of values from the enum?
Dave
there might be no way to do it by pure XAML. and it looks for me that it is done much easier with regular C#. Create a property in our ViewModel called MyTypesValues and bind to in then. ({Binding MyTypesValues}).
Andrey
+1  A: 

See my answer on this SO post: How to declare combobox itemTemplate that has Itemsource as Enum Values in WPF?

In short, in the ObjectDataProvider.MethodParameters should refer to your Enum's type name as referenced in a namespace, i.e.,

<ObjectDataProvider.MethodParameters>
  <x:Type TypeName="my:MyTypes"/>
</ObjectDataProvider.MethodParameters>
Metro Smurf