c#中用于枚举显示的UWP子类ComboBox控件



我在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上看到它并尝试它,以及我用来尝试解决这个问题的示例应用程序。

我会继续寻找原因,因为它确实让我感兴趣:-)。

最新更新