2016-05-07 164 views
0

我试图将Enum绑定到ComboBox。我看到很多人使用ObjectDataProvider,但我似乎无法访问它。我也注意到,有些人在Window.Resources而不是Page.Resources内使用它,但我无法找到它在Page.Resources上的使用方式。我一直在寻找解决方案几个小时。如何使用ObjectDataProvider将枚举绑定到XAML中的ComboBox

我到目前为止有:

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

我对你是如何调用转换器有点不清楚。你离开了多少代码? –

+0

_“我似乎无法访问它”_ - 这是什么意思?您上面显示的代码无法成功使用ObjectDataProvider,因为您已经使用空元素声明了它。它只在您提供必要的值时才有用。正确完成,它会正常工作。请提供一个很好的[mcve],它清楚地显示了你所尝试的内容,以及一个错误描述。 –

回答

0

这里是一个页面对象的例子(根据MSDN documentation有在页面中使用ObjectDataProvider没有任何限制):

更新#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> 

这里是一个自定义数据提供代码

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; 
    } 
} 

属性代码和枚举:

[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 
} 

它的样子: here.

附:这里你不需要任何转换器。 此致敬礼。

+0

@ andas1951请参阅更新后的版本,这里我使用了Display属性。 – Ilan

+0

非常感谢你的解释:)! – andas1951

+0

随时将其标记为已回答,以防情况有所帮助。 – Ilan

相关问题