Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF组合框双向绑定_Wpf_Binding - Fatal编程技术网

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
}