Можно ли это сделать? Мне нужно использовать:
this.ControlName.DataBindings.Add (...)
поэтому я не могу определить логику, отличную от привязки моего значения enum
до bool
.
Например:
(DataClass) Data.Type (enum)
EDIT:
Мне нужно привязать Data.Type
, который является перечислением для свойства флажка Checked
. Поэтому, если Data.Type
- Secure
, я хочу, чтобы SecureCheckbox
был проверен посредством привязки данных.
Связывание с 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);
а затем отмените это во время разбора.
Type type = typeof(T);
работает также с параметрами общего типа.
Хорошо, если вы привязываетесь к своему классу, у вас всегда может быть свойство на нем следующим образом:
public bool IsSecured
{
get
{
if (myEnum == SecEnum.Secured)
return true;
else
return false;
}
}
Если нужно, просто отмените настройку.