Nat*_*ist 6 c# data-binding wpf enums xaml
我有这样的数据绑定设置:
ItemsSource="{Binding Source={my:Enumeration {x:Type credit:OccupationCategory}}}"
DisplayMemberPath="Description"
SelectedValue="{Binding EmplType}"
SelectedValuePath="Value"/>
Run Code Online (Sandbox Code Playgroud)
它工作得很好.对更大的软件设计进行更改我不能再生成任何生成INotifyPropertyChanged事件的内容,因此数据绑定类型不起作用.相反,我手动设置selectedIndex并从代码构建选项,如下所示:
ItemsSource="{Binding Source={StaticResource ResidenceOwnershipType}}"/>
Run Code Online (Sandbox Code Playgroud)
哪些参考
<UserControl.Resources>
<ObjectDataProvider x:Key="ResidenceOwnershipType" MethodName="GetValues" ObjectType="{x:Type System:Enum}" >
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="credit:ResidenceOwnershipType" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)
就列表选项的构建和所有数据的链接而言,这是有效的,但我无法让组合框在枚举中显示描述标记而不是实际文本.
我尝试过这样的事情:
DisplayMemberPath="Description"
Run Code Online (Sandbox Code Playgroud)
但这不正确.我该怎么做呢?
编辑:
我的枚举:
[DataContract]
public enum ResidenceOwnershipType
{
[Description("")]
None = 0,
[Description("Owns Home Outright")]
OwnsHomeOutright = 1,
[Description("Buying Home")]
BuyingHome = 2,
[Description("Renting/Leasing")] //Weird order here reflects RouteOne website
RentingLeasing = 4,
[Description("Living w/Relatives")]
LivingWithRelatives = 3,
[Description("Owns/Buying Mobile Home")]
MobileHome = 5,
[Description("Unknown")]
Unknown = 6
}
Run Code Online (Sandbox Code Playgroud)
H.B*_*.B. 13
如果你保留这个,ItemsSource
你将不得不定义一个自定义,ItemTemplate
因为DisplayMemberPath
它只是一个你将无法检索描述的路径.
至于什么模板应该是这样的:你可以绑定TextBlock
到枚举值(当前DataContext
)和管道通过该ValueConverter
使用Binding.Converter
.该代码将只是一些反映检索Description
(GetType
,GetCustomAttributes
等等)
替代方案是一种自定义方法,可以立即返回可用的集合(并在其中使用ObjectDataProvider
)或自定义标记扩展,它可以执行相同的操作.
方法示例如果我们谈论的是ComponentModel.DescriptionAttribute
:
public static class EnumUtility
{
// Might want to return a named type, this is a lazy example (which does work though)
public static object[] GetValuesAndDescriptions(Type enumType)
{
var values = Enum.GetValues(enumType).Cast<object>();
var valuesAndDescriptions = from value in values
select new
{
Value = value,
Description = value.GetType()
.GetMember(value.ToString())[0]
.GetCustomAttributes(true)
.OfType<DescriptionAttribute>()
.First()
.Description
};
return valuesAndDescriptions.ToArray();
}
}
Run Code Online (Sandbox Code Playgroud)
<ObjectDataProvider x:Key="Data" MethodName="GetValuesAndDescriptions"
ObjectType="local:EnumUtility">
<ObjectDataProvider.MethodParameters>
<x:TypeExtension TypeName="local:TestEnum" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
Run Code Online (Sandbox Code Playgroud)
<ListBox ItemsSource="{Binding Source={StaticResource Data}}"
DisplayMemberPath="Description"
SelectedValuePath="Value"/>
Run Code Online (Sandbox Code Playgroud)