2016-09-02 2 views
0

Я разработал подклассовый элемент управления ComboBox в C#, UWP, для свойств типа перечисления.UWP подклассы управления ComboBox в C# для перечисления - Дисплей

Он отлично работает! Почти все время (... типы).

Проблема возникла, когда тип перечисления был Windows.UI.Text.FontStyle.

Выбор пункта по-прежнему работает правильно, но то, что он показывает не является .ToString() значения, но Windows.Foundation.IReference`1 <Windows.UI.Text.FontStyle> для каждого элемента.

Когда я отлаживаю, все то же и отлично, насколько мой код.

Мое управление работает с помощью DependencyProperty под названием SelectedItemEnum - SelectedItemEnumProperty, тип которого является объектом. И этим связанного приложения конкретного значения перечисления он устанавливает ItemsSource: (. И я обрабатывать событие SelectionChanged (внутри элемента управления), чтобы установить значение, но эта часть всегда хорошо работает)

ItemsSource = Enum.GetValues(SelectedItemEnum.GetType()).Cast<Enum>().ToList(); 

ответ

0

I теперь пробовали это в течение часа или около того, но я не могу понять, почему это происходит, и мне определенно было бы интересно увидеть реальную причину этого. Очевидно, что есть что-то в перечне перечислений FontStyle, что заставляет его представленный как nullable (IReference, как представляется, "equivalent" to nullable в мире .NET).

Чтобы решить вашу проблему, вы можете создать собственный ValueConverter, который преобразует значение в строку перед отображением.

Сначала создайте ToStringConverter:

public class ToStringConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     var stringValue = value.ToString(); 
     return stringValue; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Теперь добавьте в качестве ресурса на вашу страницу или само приложение:

<Page.Resources> 
    <local:ToStringConverter x:Key="ToStringConverter" /> 
</Page.Resources> 

Вы можете использовать его с поля со списком следующим образом:

<local:EnumComboBox x:Name="EnumComboBox"> 
    <local:EnumComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Converter={StaticResource ToStringConverter}}" /> 
     </DataTemplate> 
    </local:EnumComboBox.ItemTemplate> 
</local:EnumComboBox> 

Это правильно отображает значение перечисления. Вы можете увидеть его и попробовать в here on my GitHub, а также пример приложения, которое я использовал, чтобы попытаться понять это.

Тем не менее, я буду продолжать искать причину, поскольку это действительно меня интересует :-).

Смежные вопросы