我刚开始玩Silverlight,一件本应简单的事情,比如绑定Combobox,让我抓狂。我现在读了很多文章,但没有一篇真正解决我所追求的问题,也没有一篇是为Silverlight 2制作的,而且似乎不起作用。
假设我有一个实体对象“User”,它有一个“UserStatus”字段。在数据库中,UserStatus字段定义为字节,在代码中定义为:
public enum UserStatus : byte
{
Active = 1,
Locked = 2,
Suspended = 3,
}
public class EnumConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
switch (parameter.ToString())
{
case "UserStatus":
return ((UserStatus)value).ToString();;
}
return "?";
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
现在,我还需要为Combobox提供一个ItemSource,所以我实现了这一点:
internal static class EnumValueCache
{
private static readonly IDictionary<Type, object[]> Cache = new Dictionary<Type, object[]>();
public static object[] GetValues(Type type)
{
if (!type.IsEnum)
throw new ArgumentException("Type '" + type.Name + "' is not an enum");
object[] values;
if (!Cache.TryGetValue(type, out values))
{
values = type.GetFields()
.Where(f => f.IsLiteral)
.Select(f => f.GetValue(null))
.ToArray();
Cache[type] = values;
}
return values;
}
}
public class EnumValuesConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
return null;
switch (parameter.ToString())
{
case "UserStatus":
return EnumValueCache.GetValues(typeof(UserStatus));
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
<ComboBox ItemsSource="{Binding UserStatus, Mode=TwoWay, Converter={StaticResource EnumValuesConverter}, ConverterParameter='UserStatus'}"
SelectedItem="{Binding UserStatus, Mode=TwoWay, Converter={StaticResource EnumConverter}, ConverterParameter='UserStatus'}" />
现在发生的事情是,Items Source被正确绑定,我在下拉列表中看到了所有选项,但是SelectedItem没有设置。
即使我尝试手动将SelectedItem设置为=“1”或“活动”,它们都不起作用。
谢谢,
汤姆