我已经看到很多用于将ReactiveList绑定到WPF中的ComboBox控件的解决方案,以便控件显示枚举项'说明。所有这些解决方案都在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中以正确的方式提供一个很好的例子吗?
答案 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;
只是一个开始的想法,有趣的编码:)