WPF组合框双向绑定
我有一个简单的WPF组合框双向绑定,wpf,binding,Wpf,Binding,我有一个简单的组合框,其中有一些简单的值。我正在尝试对模型上的枚举属性进行双向绑定 <ComboBox d:LayoutOverrides="Height" Grid.Column="1" SelectedItem="{Binding SortType, Converter={StaticResource sortSelect}, Mode=TwoWay}"> <ListBoxItem Content="Ascending" Tag="Ascending"/>
组合框
,其中有一些简单的值。我正在尝试对模型上的枚举属性进行双向绑定
<ComboBox d:LayoutOverrides="Height" Grid.Column="1" SelectedItem="{Binding SortType, Converter={StaticResource sortSelect}, Mode=TwoWay}">
<ListBoxItem Content="Ascending" Tag="Ascending"/>
<ListBoxItem Content="Descending" Tag="Descending"/>
<ListBoxItem Content="Absolute Ascending" Tag="AbsoluteAscending"/>
<ListBoxItem Content="Absolute Descending" Tag="AbsoluteDescending" />
</ComboBox>
ConvertBack
方法工作正常,并根据ListBoxItem
中的标记
值更新我的模型,但我无法获得初始Enum
值来选择正确的ListBoxItem
实现这一点的最佳方法是什么,或者是否有更好的方法绑定t
Enum
(考虑到我需要对每个Enum
值进行自定义描述。您可以这样做。首先为每个Enum值添加描述
public enum RdiSort
{
[Description("Ascending Description")]
Ascending,
[Description("Descending Description")]
Descending,
[Description("AbsoluteAscending Description")]
AbsoluteAscending,
[Description("AbsoluteDescending Description")]
AbsoluteDescending
}
然后对组合框使用ObjectDataProvider
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:MyEnumerations="clr-namespace:MyEnumerations"
<ObjectDataProvider MethodName="GetValues"
ObjectType="{x:Type sys:Enum}"
x:Key="RdiSortValues">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="MyEnumerations:RdiSort" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
这是我所做的解决方案 .xaml=>
<UserControl.Resources>
<c:PriorityConvertor x:Key="priorityConvertor"></c:PriorityConvertor>
</UserControl.Resources>
}请参见此问题:
<local:EnumDescriptionConverter x:Key="EnumDescriptionConverter"/>
<ComboBox SelectedItem="{Binding SortType}"
ItemsSource="{Binding Source={StaticResource RdiSortValues}}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource EnumDescriptionConverter}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
public class EnumDescriptionConverter : IValueConverter
{
private string GetEnumDescription(Enum enumObj)
{
FieldInfo fieldInfo = enumObj.GetType().GetField(enumObj.ToString());
object[] attribArray = fieldInfo.GetCustomAttributes(false);
if (attribArray.Length == 0)
{
return enumObj.ToString();
}
else
{
DescriptionAttribute attrib = attribArray[0] as DescriptionAttribute;
return attrib.Description;
}
}
object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value != null)
{
RdiSort myEnum = (RdiSort)value;
string description = GetEnumDescription(myEnum);
return description;
}
return null;
}
object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return string.Empty;
}
}
<UserControl.Resources>
<c:PriorityConvertor x:Key="priorityConvertor"></c:PriorityConvertor>
</UserControl.Resources>
public class PriorityConvertor : IValueConverter
{
#region IValueConverter Members
object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null)
{
return string.Empty;
}
if (value.ToString() == "1")
{
return "High";
}
else if (value.ToString() == "2")
{
return "Medium";
}
else if (value.ToString() == "3")
{
return "Low";
}
return "Low";
}
object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}