【发布时间】:2017-06-07 14:26:58
【问题描述】:
我有一个 Poco 类,其中一个属性是枚举类型。
为了使枚举属性在 UI 层 (WPF) 上可本地化,我为查找本地化枚举值的枚举类型创建了一个 TypeConverter。
此 POCO 类的实例列表绑定到 WPF DataGrid:
// in the ViewModel:
public Pocos = CollectionViewSource.GetDefaultView( DataLayer.GetPocos() );
效果很好。
后来我重构了代码,使数据层不再返回List<Poco>,而是返回List<ExpandoObject>:
public Pocos = CollectionViewSource.GetDefaultView( DataLayer.GetExpandos() );
这些ExpandoObjects 是数据库查询的结果,仅包含原始Poco's 属性的子集,具体取决于选择语句。
一切正常,除了不再调用的枚举属性的TypeConverter。
TypeConverter 仍然是暴露的,所以这有效:
dynamic eo = new ExpandoObject();
eo.EnumProperty = MyEnum.SomeValue;
var converter = TypeConverter.GetConverter( (eo.EnumProperty).GetType() );
var result = converter.ConvertTo( eo.EnumProperty, typeof( string ) );
我不知道 WPF 的 DataGrid 内部发生了什么。我的印象是,无论出于何种原因,它只是在枚举类型属性上调用ToString(),而不是调用TypeConverter。
有什么方法可以让它工作吗?
实现细节:
XAML:
<DataGrid x:Name="PocoGrid" x:FieldModifier="public"
Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="2"
ItemsSource="{Binding Pocos}"
SelectedItem="{Binding SelectedPoco}"
bh:DataGridColumnsBehavior.BindableColumns="{Binding PocoColumns}"
IsSynchronizedWithCurrentItem="True" IsReadOnly="True" AutoGenerateColumns="False">
<DataGrid.InputBindings>
<MouseBinding MouseAction="LeftDoubleClick" Command="{Binding PocoDoubleClick}" CommandParameter="{Binding Pocos/}"/>
</DataGrid.InputBindings>
</DataGrid>
类型转换器:
public abstract class EnumTypeConverterBase : TypeConverter
{
public static ILocalizedResourceProvider ResourceProvider { get; set; } = null;
}
public class EnumTypeConverter<T> : EnumTypeConverterBase where T : struct, IConvertible, IComparable
{
private static string typeParameterName = typeof(T).Name;
public override bool CanConvertFrom( ITypeDescriptorContext context, Type sourceType )
{
if( sourceType == typeof( string ) )
return true;
return base.CanConvertFrom( context, sourceType );
}
public override object ConvertFrom( ITypeDescriptorContext context, CultureInfo culture, object value )
{
throw new NotImplementedException();
}
public override object ConvertTo( ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType )
{
string val = value.ToString();
if( ResourceProvider == null )
return val;
else
return ResourceProvider.GetEnum( typeParameterName, val );
}
}
枚举定义:
[TypeConverter( typeof( EnumTypeConverter<MyEnum> ) )]
public enum MyEnum
{
Unknown = 0,
SomeValue = 1,
SomeOtherValue = 2
}
【问题讨论】:
标签: c# wpf datagrid typeconverter expandoobject