Из того, что я понимаю из вашего вопроса, вы храните базовые указатели объектов, но извне вы хотите оперировать ими как производными объектами, которыми они являются.
В этом случае крайне важно понизить рейтинг.
Хотя ваш вопрос расплывчатый, я вижу, что ваша ситуация очень похожа на элемент управления в диалоговом окне, где оба являются окнами, но говорят, что CheckBox - это специализированное окно, над которым вы хотите работать, в частности, с расширенными функциями.
Основные рамки используют приведение для этой проблемы, как MFC здесь .
В новой платформе Qt также используется приведение, как в функции findChildren .
Я надеюсь, что вы сможете оценить свое решение, учитывая эту информацию, и, возможно, помириться с ней.
Я нашел способ сделать этот Набор данных/Таблицу данных использования.
Я делаю вычисляемый столбец в DataTable с выражением IIF(Foo=true, false, true)
. Давайте назовем тот столбец Bar
.
Bar
имеет булевскую переменную типа. Теперь можно связать тот RadioButton.Checked
кому: Foo
и один к Bar
.
Добираться Bar
проверка/снятие выделения для распространения назад к Foo
необходимо перейти к сгенерированному коду DataTable и добавить одну строку, последнюю в этом образце:
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public bool Bar {
get {
try {
return ((bool)(this[this.tableradio.BarColumn]));
}
catch (global::System.InvalidCastException e) {
throw new global::System.Data.StrongTypingException("The value for column \'Bar\' in table \'radio\' is DBNull.", e);
}
}
set {
this[this.tableradio.BarColumn] = value;
this[this.tableradio.FooColumn] = !value;
}
}
Если Ваш бизнес-объект реализует INotifyPropertyChanged (который делает обязательную работу более хорошей), можно добавить следующий код к визуальному интерфейсу где BO
Ваш бизнес-объект и объявляется withevents и BO.Value
булево свойство, с которым требуется связать.
Public Property NotValue() As Boolean
Get
Return Not BO.Value
End Get
Set(ByVal value As Boolean)
BO.Value = Not value
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("NotValue"))
End Set
End Property
Private Sub BO_PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Handles BO.PropertyChanged
If e.PropertyName = "Value" Then
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("NotValue"))
End If
End Sub
Следующая привязка поднимет трубку переключатели.
RBTrue.DataBindings.Add(New Binding("Checked", Me.BO, "Value", False, DataSourceUpdateMode.OnPropertyChanged))
RBFalse.DataBindings.Add(New Binding("Checked", Me, "NotValue", False, DataSourceUpdateMode.OnPropertyChanged))
Визуальный интерфейс должен также реализовать INotifyPropertyChanged. Этот метод работает оба пути: исходное значение обновляется, если интерфейс изменится и если исходное значение изменится, то интерфейс обновит правильно.
Вам придется только связать одни из средств управления, пока Вы удостоверяетесь, что они находятся в той же группе.
Вы могли также рассмотреть DropDown.
RadioButton
, который напрямую связан с вашим логическим значением (т. Е. Проверяется, когда значение истина
). Добавить событие обработчик события CheckedChanged
в этом RadioButton
, который выглядит следующим образом:
private void radioButton_CheckedChanged (объект-отправитель, EventArgs e)
{
foreach (Binding b в ((Control) sender) .DataBindings)
b.WriteValue ();
}