2016-05-07 12 views
0

Ich versuche, eine Enum an eine ComboBox zu binden. Ich habe viele Leute gesehen, die eine ObjectDataProvider benutzen, aber ich kann nicht darauf zugreifen. Ich habe auch bemerkt, dass einige Leute es innerhalb einer Window.Resources anstatt Page.Resources verwenden, aber ich kann nicht finden, wie es auf Page.Resources verwendet wird. Ich habe stundenlang nach einer Lösung gesucht.Wie verwende ich einen ObjectDataProvider, um eine Enum an eine ComboBox in XAML zu binden

Was ich habe, so weit:

XAML

<Page 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:Sports;assembly=Sports" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:ViewModel="using:Sports.ViewModel" 
xmlns:model="using:Sports.Model" 
xmlns:system="using:System" 


x:Class="Sports.MainPage" 
mc:Ignorable="d"> 

<Page.DataContext> 
    <ViewModel:CreateSubsVM/> 
</Page.DataContext> 
    <Page.Resources> 

    <ObjectDataProvider></ObjectDataProvider> 
    </Page.Resources> 
    </Grid> 
</Page> 

C#

public enum SubsAmount 
{ 
    [Display(Description = "One Year")] 
    Oneyear = 0, 
    [Display(Description = "Two Years")] 
    TwoYears = 1, 
    [Display(Description = "Three Years")] 
    ThreeYears = 2 
} 


public class ComboboxConverter: IValueConverter 
{ 

    public string GetEnumValues(Enum enumObj) 
    { 
     DisplayAttribute attribute = enumObj.GetType(). 
     GetRuntimeField(enumObj.ToString()). 
     GetCustomAttributes(typeof(SubsAmount), false). 
     SingleOrDefault() as DisplayAttribute; 
     return attribute == null ? enumObj.ToString() : attribute.Description; 
    } 


    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     return GetEnumValues((Enum) value); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     return Enum.ToObject(targetType, value); 
    } 
} 
+0

Ich bin ein wenig unklar, wie Sie den Konverter tatsächlich aufrufen. Wie viel Code hast du weggelassen? –

+0

_ "Ich kann nicht darauf zugreifen" _ - was bedeutet das? Der oben angezeigte Code kann 'ObjectDataProvider' nicht erfolgreich verwenden, weil Sie ihn mit einem leeren Element deklariert haben. Es funktioniert nur, wenn Sie die erforderlichen Werte angeben. Richtig ausgeführt, wird es gut funktionieren. Bitte stellen Sie eine gute [mcve] zur Verfügung, die deutlich zeigt, was Sie versucht haben, zusammen mit einer genauen Beschreibung, was falsch gelaufen ist. –

Antwort

0

Hier ein Beispiel mit einem Seitenobjekt ist (nach dem MSDN documentation gibt es keine Einschränkung für die Verwendung des ObjectDataProvider mit Seite):

Update # 1

XAML

<Page x:Class="PageBasedApp.MyPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:pageBasedApp="clr-namespace:PageBasedApp" 
    mc:Ignorable="d" 
    d:DesignHeight="300" d:DesignWidth="300" 
Title="MyPage"> 
<Page.Resources> 
    <ObjectDataProvider x:Key="Gestures" MethodName="GetValues" ObjectType="{x:Type ApplicationGesture}"> 
     <ObjectDataProvider.MethodParameters> 
      <x:Type TypeName="ApplicationGesture" /> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 
    <ObjectDataProvider x:Key="SubAmounts" MethodName="GetShortListOfApplicationGestures" ObjectType="{x:Type pageBasedApp:DisplayAttributeBasedObjectDataProvider}"> 
     <ObjectDataProvider.MethodParameters> 
      <x:Type TypeName="pageBasedApp:SubsAmount" /> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 
</Page.Resources> 

<Grid> 
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" > 
     <Label Content="All Gestures:"/> 
     <ComboBox ItemsSource="{Binding Source={StaticResource Gestures}}" Width="150"/> 
     <Label Content="Sub Amounts:"/> 
     <ComboBox ItemsSource="{Binding Source={StaticResource SubAmounts}}" Width="150"/> 
    </StackPanel> 
</Grid> 

Hier ist ein eigener Datenanbieter Code

public class DisplayAttributeBasedObjectDataProvider : ObjectDataProvider 
{ 
    public object GetEnumValues(Enum enumObj) 
    { 
     var attribute = enumObj.GetType().GetRuntimeField(enumObj.ToString()). 
      GetCustomAttributes(typeof(DisplayAttribute), false). 
      SingleOrDefault() as DisplayAttribute; 
     return attribute == null ? enumObj.ToString() : attribute.Description; 
    } 

    public List<object> GetShortListOfApplicationGestures(Type type) 
    { 
     var shortListOfApplicationGestures = Enum.GetValues(type).OfType<Enum>().Select(GetEnumValues).ToList(); 
     return 
      shortListOfApplicationGestures; 
    } 
} 

Attribut Code und Enum:

[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)] 
public class DisplayAttribute : Attribute 
{ 
    public DisplayAttribute(string displayName) 
    { 
     Description = displayName; 
    } 

    public string Description { get; set; } 
} 

public enum SubsAmount 
{ 
    [Display("One Year")] 
    Oneyear = 0, 
    [Display("Two Years")] 
    TwoYears = 1, 
    [Display("Three Years")] 
    ThreeYears = 2 
} 

Wie es aussieht: here.

P. S. Sie benötigen hier keine Konverter. Grüße.

+0

@ andas1951 bitte die aktualisierte Version, hier habe ich das Display-Attribut verwendet, wie Sie versucht haben. – Ilan

+0

Vielen Dank für die Erklärung :)! – andas1951

+0

Fühlen Sie sich frei, dies als beantwortet zu markieren, falls es hilfreich war. – Ilan

Verwandte Themen