Привязка типа enum к текстовому полю - PullRequest
3 голосов
/ 12 сентября 2010

Я связываю значение textbox.text с типом enum. Мой enum выглядит так

public enum Type
    {

        Active,

        Selected,

        ActiveAndSelected
    }

Я не хочу показывать в текстовом поле «Активный режим» вместо «Активный» и так далее. Возможно ли это сделать? Было бы здорово, если бы я мог сделать это в XAML - потому что все привязки у меня есть в файле стиля style.xaml

Я пытался использовать атрибуты Description, но, похоже, этого недостаточно

Ответы [ 3 ]

9 голосов
/ 05 января 2011

ИМХО, лучше использовать конвертер.

Первое, что вы должны сделать, это реализовать простой атрибут, чтобы добавить некоторые метаданные к вашим элементам enum. Вот основной пример (без интернационализации для простоты):

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

Кроме того, вы можете написать служебный класс, способный преобразовывать элемент enum в соответствующее представление 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}}" ... />

Проверьте следующую страницу ; он дает пример, который поддерживает интернационализацию, но в принципе принцип тот же ..

5 голосов
/ 13 сентября 2010

Вам не нужен конвертер для этого простого случая.Используйте Stringformat вместо.Первая '{}' - это escape-последовательность, которая сообщает парсеру, что вы не хотите использовать их для другого вложенного тега.Если вы добавите текст перед связанным текстом (обозначен '{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 голос
/ 12 сентября 2010

Вы можете использовать конвертер для этого. Привязка к перечислению обычно выполняется, но в привязку добавляется свойство Converter. Конвертер - это класс, реализующий IValueConverter, который будет вызываться WPF. Там вы можете добавить суффикс типа «Режим» (или делать все что угодно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...