我在c# UWP中开发了一个子类ComboBox控件,用于枚举类型的属性。
效果很好!几乎所有的时候……类型)。
当枚举类型为Windows.UI.Text.FontStyle时出现问题。
项目选择仍然正常工作,但它显示的不是。tostring()值,而是Windows.Foundation.IReference ' 1
当我调试时,就我的代码而言,一切都是一样的,很好。
我的控制工作的DependencyProperty称为SelectedItemEnum - SelectedItemEnumProperty,它的类型是对象。通过这个绑定的具体enum值,它设置ItemsSource:
ItemsSource = Enum.GetValues(SelectedItemEnum.GetType()).Cast<Enum>().ToList();
(我处理SelectionChanged事件(在控件内)来设置值,但那部分总是工作得很好。)
我现在已经尝试了一个小时左右,但我无法弄清楚为什么会发生这种情况,我绝对有兴趣看到这背后的真正原因。显然,有一些关于FontStyle
枚举的东西,导致它被表示为可空(IReference
似乎在。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>
这将正确显示枚举的值。你可以在我的GitHub上看到它并尝试它,以及我用来尝试解决这个问题的示例应用程序。
我会继续寻找原因,因为它确实让我感兴趣:-)。