将ReactiveList <enum>绑定到组合框

时间:2015-09-02 20:21:29

标签: c# wpf enums reactiveui

我已经看到很多用于将ReactiveList绑定到WPF中的ComboBox控件的解决方案,以便控件显示枚举项&#39;说明。所有这些解决方案都在XAML中使用标准TypeConverter和绑定,但我使用ReactiveUI,所以我想在后面的代码中进行绑定。没有任何转换,我将原始枚举值作为字符串而不是它们的描述,所以至少我知道绑定工作正常,但我还没有想出转换。

我非常确定我需要使用IBindingTypeConverter(并使用Splat注册它),但我似乎无法在我的转换器中找到正确的toType和fromType组合来实现这一点。我尝试了以下部分成功:

public class MyEnumToStringConverter : IBindingTypeConverter
{
    public int GetAffinityForObjects(Type fromType, Type toType)
    {
        if (fromType == tyepof(ReactiveList<MyEnumType>))
        {
            return 100;
        }
        return 0;
    }

    public bool TryConvert(object from, Type toType, object conversionHint, out object result)
    {
        ...
    }
}

在调试器中,GetAffinityForObjects()被命中并在调用期间返回100以绑定ComboBox的ItemsSource,但TryConvert永远不会被调用。

任何人都可以在ReactiveUI中以正确的方式提供一个很好的例子吗?

1 个答案:

答案 0 :(得分:0)

只是一个想法很多东西: Display System.ComponentModel.DataAnnotations命名空间的DisplayName部分,但您可以使用其他名称,只需更改public enum CoolEnum { [Display(Name="Value 1")] Value1, [Display(Name="Value 2")] Value2, } public static class EnumExtensions { public static string DisplayName(this Enum value) { Type enumType = value.GetType(); var enumValue = Enum.GetName(enumType, value); MemberInfo member = enumType.GetMember(enumValue)[0]; var attrs = member.GetCustomAttributes(typeof(DisplayAttribute), false); var outString = ((DisplayAttribute)attrs[0]).Name != null ? ((DisplayAttribute)attrs[0]).Name : enumValue; //TODO Null check if (((DisplayAttribute)attrs[0]).ResourceType != null) { outString = ((DisplayAttribute)attrs[0]).GetName(); } return outString; } } 方法

var enumValue = CoolEnum.Value1;
var displayValue = enumValue.DisplayName();

像这样使用:

public class EnumToDisplayName : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        try 
        {
            var enumValue = (CoolEnum)value;
            return enumValue.DisplayName();
        }
        catch (Exception){
        }
        return string.Empty;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return System.Windows.DependencyProperty.UnsetValue;
    }
}

在XAML中可以使用ValueConverter

<UserControl.Resources>
    <local:EnumToDisplayValue x:Key="enumToDisplayValue" />
</UserControl.Resources>

Text="{Binding enumValue, Converter={StaticResource enumToDisplayValue}}"

在XAML内部绑定数据的内容中,将转换器映射为资源并使用它:

var array = [];
array[0] = ['AM', 'a.m.'];
array[1] = ['PM', 'p.m.'];
array[2] = ['application', 'app'];
array[3] = ['cancelation', 'cancellation'];
array[4] = ['crash', 'close'];
array[5] = ['crashes', 'closes'];
array[6] = ['crashing', 'closing'];
array[7] = ['digital TV', 'smart TV'];
array[8] = ['dropdown', 'drop-down'];
array[9] = ['grey', 'gray'];
array[10] = ['mbps', 'megabits per second'];
array[11] = ['plugin', 'plug-in'];
array[12] = ['normal', 'standard'];
array[13] = ['is stuck', 'is frozen'];
array[14] = ['gets stuck', 'freezes'];
array[15] = ['wifi', 'Wi-Fi'];
array[16] = ['TV\'s', 'TVs'];
array[17] = ['Bluray', 'Blu-ray'];
array[18] = ['Blu-Ray', 'Blu-ray'];
array[19] = ['set top box', 'set-top box'];
array[20] = ['choose', 'select'];
array[21] = ['log in', 'sign in'];
array[22] = ['log out', 'sign out'];
array[23] = ['onscreen', 'on-screen'];
array[24] = ['right hand', 'right'];
array[25] = ['left hand', 'left'];

$('#article').val(function (i, v) {
    $.each(array, function (i, arr) {
        v = v.replace(arr[0], arr[1]);
    })
    return v;
});
return false;

只是一个开始的想法,有趣的编码:)