Как конвертировать enum в bool для привязки данных в Winforms?

2

Можно ли это сделать? Мне нужно использовать:

this.ControlName.DataBindings.Add (...)

поэтому я не могу определить логику, отличную от привязки моего значения enum до bool.

Например:

(DataClass) Data.Type (enum)

EDIT:

Мне нужно привязать Data.Type, который является перечислением для свойства флажка Checked. Поэтому, если Data.Type - Secure, я хочу, чтобы SecureCheckbox был проверен посредством привязки данных.

  • 1
    Может быть, вы могли бы быть немного более конкретным о том, что вы хотите связать с чем? CheckBox для столбца int? Перечислить в битовый столбец?
  • 0
    Извините, я добавил больше деталей сейчас.
Теги:
winforms
data-binding

2 ответа

8
Лучший ответ

Связывание с Winforms генерирует два важных и полезных события: Format и Parse.

Событие формата запускается при извлечении данных из источника в элемент управления, а событие Parse срабатывает при выводе данных из элемента управления обратно в источник данных.

Если вы обрабатываете эти события, вы можете изменять/повторно вводить значения, возвращающиеся вперед и назад во время привязки.

Например, вот несколько примеров обработчиков для этих событий:

 public static void StringValuetoEnum<T>(object sender, ConvertEventArgs cevent)
 {
      T type = default(T);
      if (cevent.DesiredType != type.GetType()) return;
      cevent.Value = Enum.Parse(type.GetType(), cevent.Value.ToString());
 }

 public static void EnumToStringValue<T>(object sender, ConvertEventArgs cevent)
 {
      //if (cevent.DesiredType != typeof(string)) return;
      cevent.Value = ((int)cevent.Value).ToString();
 }

И вот какой код содержит эти обработчики событий:

 List<NameValuePair> bts = EnumHelper.EnumToNameValuePairList<LegalEntityType>(true, null);
 this.cboIncType.DataSource = bts;                
 this.cboIncType.DisplayMember = "Name";
 this.cboIncType.ValueMember = "Value";

 Binding a = new Binding("SelectedValue", this.ActiveCustomer.Classification.BusinessType, "LegalEntityType");
 a.Format += new ConvertEventHandler(ControlValueFormatter.EnumToStringValue<LegalEntityType>);
 a.Parse += new ConvertEventHandler(ControlValueFormatter.StringValuetoEnum<LegalEntityType>);
 this.cboIncType.DataBindings.Add(a);

Итак, в вашем случае вы можете просто создать обработчик SecEnum для Bool для события формата и внутри этого сделать что-то вроде:

 SecEnum se = Enum.Parse(typeof(SecEnum), cevent.Value.ToString());
 cevent.Value = (bool)(se== SecEnum.Secure);

а затем отмените это во время разбора.

  • 0
    Type type = typeof(T); работает также с параметрами общего типа.
1

Хорошо, если вы привязываетесь к своему классу, у вас всегда может быть свойство на нем следующим образом:

public bool IsSecured
{
   get 
   {
      if (myEnum == SecEnum.Secured)
         return true;
      else 
         return false;
   }
}

Если нужно, просто отмените настройку.

  • 3
    return (myEnum == SecEnum.Secured);
  • 0
    Спасибо, я сделал аналогичный с INotifyPropertyChanged, но это не сработало. Поскольку я изменял сами данные, IsProperty не было сигнализировано. Я пытался сделать это сам, но это тоже не помогло.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню