将枚举类型绑定到文本框

3
我将文本框的文本值绑定到枚举类型上。 我的枚举看起来像这样:
public enum Type
    {

        Active,

        Selected,

        ActiveAndSelected
    }

我希望实现的是在文本框中显示“活动模式”而不是“活动”,以此类推。这是否可能?如果我可以在XAML中实现这个目标,那就太好了——因为我在样式文件style.xaml中有所有的绑定。我尝试使用Description属性,但似乎这还不够。
3个回答

10

在我看来,使用转换器是更好的方法。

第一件要做的事情是实现一个简单的属性,以便为您的枚举元素添加一些元数据。这是一个基本示例(为了简单起见,没有包含国际化):

    public enum StepStatus {
    [StringValue("Not done yet")]
    NotDone,
    [StringValue("In progress")]
    InProgress,
    [StringValue("Failed")]
    Failed,
    [StringValue("Succeeded")]
    Succeeded
}

接下来,您可以编写一个实用类,使用反射从枚举元素转换为其对应的StringValue表示法。在Google中搜索“C#中的字符串枚举 - CodeProject”,您将找到CodeProject关于此主题的文章(抱歉,我的知名度不够高,无法添加链接..)

现在,您可以实现一个简单的转换器,将转换委托给实用类:

    [ValueConversion(typeof(StepStatus), typeof(String))]
public class StepStatusToStringConverter: IValueConverter {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture){
        String retVal = String.Empty;

        if (value != null && value is StepStatus) {
            retVal = StringEnum.GetStringValue((StepStatus)value);
        }

        return retVal;
    }

    /// <summary>
    /// ConvertBack value from binding back to source object. This isn't supported.
    /// </summary>
    public object ConvertBack(object value, Type targetType,
        object parameter, CultureInfo culture) {
        throw new Exception("Can't convert back");
    }
}

最后,您可以在XAML代码中使用转换器:
<resourceWizardConverters:StepStatusToStringConverter x:Key="stepStatusToStringConverter" />
...
<TextBox Text="{Binding Path=ResourceCreationRequest.ResourceCreationResults.ResourceCreation, Converter={StaticResource stepStatusToStringConverter}}" ... />

请查看以下页面,它提供了一个支持国际化的示例,但基本原则是相同的。


7

对于这种简单的情况,您不需要使用转换器。请使用Stringformat。前导'{}'是一个转义序列,告诉解析器您不打算将它们用于另一个嵌套标记。如果在绑定文本(由'{0}'表示)之前添加文本,则可以删除它们。

<Window x:Class="TextBoxBoundToEnumSpike.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <TextBox Text="{Binding ModeEnum,StringFormat={}{0} Mode}"/>
        <Button Click="Button_Click" Height=" 50">
            Change to 'Selected'
        </Button>
    </StackPanel>
</Window>

using System.ComponentModel;
using System.Windows;

namespace TextBoxBoundToEnumSpike
{

    public partial class MainWindow : Window,INotifyPropertyChanged
    {
        private ModeEnum m_modeEnum;
        public MainWindow()
        {
            InitializeComponent();

            DataContext = this;
            ModeEnum = ModeEnum.ActiveAndSelected;
        }

        public ModeEnum ModeEnum
        {
            set
            {
                m_modeEnum = value;
                if (PropertyChanged!=null)PropertyChanged(this,new PropertyChangedEventArgs("ModeEnum"));
            }
            get { return m_modeEnum; }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            ModeEnum = ModeEnum.Selected;
        }
    }

    public  enum ModeEnum
    {
        Active,
        Selected,
        ActiveAndSelected
    }
}

1
你可以使用 Converter 来实现此功能。正常绑定到枚举,但需要在绑定中添加 Converter 属性。Converter 是一个实现 IValueConverter 接口的类,WPF 会调用它。在其中,你可以添加后缀,例如“Mode”(或者任何你想要的)。

请您能给我一些例子吗? - george dobravski
是的,我可以(请参见http://blogs.msdn.com/b/bencon/archive/2006/05/10/594886.aspx),但@dabblernl的回答更好。 - Timores

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接