gpt4 book ai didi

c# - 将 ReactiveList 绑定(bind)到组合框

转载 作者:太空宇宙 更新时间:2023-11-03 15:34:24 24 4
gpt4 key购买 nike

我见过很多将 ReactiveList 绑定(bind)到 WPF 中的 ComboBox 控件的解决方案,以便控件显示枚举项的描述。所有这些解决方案都在 XAML 中使用标准 TypeConverter 和绑定(bind),但我使用的是 ReactiveUI,所以我想在后面的代码中进行绑定(bind)。在没有任何类型的转换的情况下,我将原始枚举值作为字符串而不是它们的描述,所以至少我知道绑定(bind)工作正常,但我还没有弄清楚转换。

我很确定我需要使用 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 以绑定(bind) ComboBox 的 ItemsSource,但从未调用 TryConvert。

谁能提供一个很好的例子来说明在 ReactiveUI 中以正确的方式执行此操作?

最佳答案

只是一个想法它有很多东西:DisplaySystem.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();

在 XAML 中可以使用 ValueConverter

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;
}
}

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

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

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

只是一个开始的想法,祝你编码愉快:)

关于c# - 将 ReactiveList<enum> 绑定(bind)到组合框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32362407/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com