gpt4 book ai didi

silverlight - 将组合框绑定(bind)到枚举...在 Silverlight 中!

转载 作者:行者123 更新时间:2023-12-03 07:34:53 25 4
gpt4 key购买 nike

因此,网络和 StackOverflow 对于如何将组合框绑定(bind)到 WPF 中的枚举属性有很多很好的答案。但是 Silverlight 缺少使这成为可能的所有功能:(。例如:

  1. 您不能使用通用 EnumDisplayer -style IValueConverter 接受类型参数,因为 Silverlight 不支持 x:Type
  2. 您不能使用 ObjectDataProvider,如 this approach 中所示,因为它在 Silverlight 中不存在。
  3. 您不能使用自定义标记扩展(如 #2 中链接的注释中所示),因为 Silverlight 中不存在标记扩展。
  4. 您不能使用泛型而不是对象的 Type 属性来实现 #1 的版本,因为 XAML 不支持泛型(并且使它们工作的技巧全部依赖于标记)扩展,Silverlight 不支持)。

巨大的失败!

据我所知,实现这项工作的唯一方法是

  1. 欺骗并绑定(bind)到我的 ViewModel 中的字符串属性,其 setter/getter 执行转换,使用 View 中的代码隐藏将值加载到 ComboBox 中。
  2. 为我想要绑定(bind)的每个枚举创建一个自定义 IValueConverter

是否有更通用的替代方案,即不涉及为我想要的每个枚举一遍又一遍地编写相同的代码?我想我可以使用接受枚举作为类型参数的泛型类来执行解决方案 #2,然后为我想要的每个枚举创建新类,这只是

class MyEnumConverter : GenericEnumConverter<MyEnum> {}

小伙伴们,你们有什么想法吗?

最佳答案

哎呀,我说得太早了!有a perfectly good solution ,至少在 Silverlight 3 中是这样。(可能只在 3 中,因为 this thread 表明与此内容相关的错误已在 Silverlight 3 中修复。)

基本上,您需要一个用于 ItemsSource 属性的转换器,但它可以是完全通用的,无需使用任何禁止的方法,只要您向其传递类型为MyEnum。并且将数据绑定(bind)到 SelectedItem 是完全轻松的;无需转换器!好吧,至少只要您不希望通过例如为每个枚举值自定义字符串即可。 DescriptionAttribute,嗯...可能需要另一个转换器;希望我能让它通用。

更新:我制作了一个转换器并且它可以工作!遗憾的是,我现在必须绑定(bind)到 SelectedIndex,但没关系。使用这些人:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows.Data;

namespace DomenicDenicola.Wpf
{
public class EnumToIntConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
// Note: as pointed out by Martin in the comments on this answer, this line
// depends on the enum values being sequentially ordered from 0 onward,
// since combobox indices are done that way. A more general solution would
// probably look up where in the GetValues array our value variable
// appears, then return that index.
return (int)value;
}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return Enum.Parse(targetType, value.ToString(), true);
}
}
public class EnumToIEnumerableConverter : IValueConverter
{
private Dictionary<Type, List<object>> cache = new Dictionary<Type, List<object>>();

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var type = value.GetType();
if (!this.cache.ContainsKey(type))
{
var fields = type.GetFields().Where(field => field.IsLiteral);
var values = new List<object>();
foreach (var field in fields)
{
DescriptionAttribute[] a = (DescriptionAttribute[])field.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (a != null && a.Length > 0)
{
values.Add(a[0].Description);
}
else
{
values.Add(field.GetValue(value));
}
}
this.cache[type] = values;
}

return this.cache[type];
}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
}

使用这种绑定(bind) XAML:

<ComboBox x:Name="MonsterGroupRole"
ItemsSource="{Binding MonsterGroupRole,
Mode=OneTime,
Converter={StaticResource EnumToIEnumerableConverter}}"
SelectedIndex="{Binding MonsterGroupRole,
Mode=TwoWay,
Converter={StaticResource EnumToIntConverter}}" />

这种资源声明 XAML:

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ddwpf="clr-namespace:DomenicDenicola.Wpf">
<Application.Resources>
<ddwpf:EnumToIEnumerableConverter x:Key="EnumToIEnumerableConverter" />
<ddwpf:EnumToIntConverter x:Key="EnumToIntConverter" />
</Application.Resources>
</Application>

任何评论将不胜感激,因为我有点像 XAML/Silverlight/WPF/等。新手。例如,EnumToIntConverter.ConvertBack 是否会很慢,因此我应该考虑使用缓存?

关于silverlight - 将组合框绑定(bind)到枚举...在 Silverlight 中!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1281490/

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