Класс «Мой домен / Бизнес-модель» содержит свойство «Mode» типа «string». Для режимов AUTO / MANUAL / IMPORT свойство Mode должно содержать «A» / «M» / «I» соответственно. Моя модель предметной области получена моим классом Presentation Model через конструктор в Presentation Model.
Класс My Presentation Model содержит три логические переменные в виде
"IsAutoMode", "IsManualMode", "IsImportMode". Эти логические переменные будут использоваться для привязки данных к переключателям формы. GET / SET для этих логических свойств немного расширен для обработки обновления соответствующего свойства («Mode») в доменной модели. Обратите внимание на код свойства GET / SET в классе модели презентации ниже -
public bool IsAutoMode
{
get
{
return _domainModel.Mode.ToUpper() == "A";
}
set
{
_domainModel.Mode = (value == true) ? "A" : _domainModel.Mode;
}
}
public bool IsManualMode
{
get
{
return _domainModel.Mode.ToUpper() == "M";
}
set
{
_domainModel.Mode = (value == true) ? "M" : _domainModel.Mode;
}
}
public bool IsImportMode
{
get
{
return _domainModel.Mode.ToUpper() == "I";
}
set
{
_domainModel.Mode = (value == true) ? "I" : _domainModel.Mode;
}
}
Теперь, когда эти булевы свойства настроены в классе модели презентации, вы можете легко связать элементы управления переключателями в форме, как показано ниже
rbtnAutoMode.DataBindings.Add("Checked", _pmodel, "IsAutoMode");
rbtnManualMode.DataBindings.Add("Checked", _pmodel, "IsManualMode");
rbtnImportMode.DataBindings.Add("Checked", _pmodel, "IsImportMode");
, и вы увидите, как ваша кнопка с зависимой фиксацией полетела. Текущий пример остается действительным независимо от того, какой тип свойства вы хотите сохранить в модели предметной области, будь то "строка", "логическое значение", что угодно. Ключевой момент заключается в том, чтобы положиться -
get
{
return _domainModel.Mode.ToUpper() == <corresponding domain property val>;
}
в свойстве GET, а не в возврате значения локального поля и в значение NOT TO для установки какого-либо значения в модели предметной области, если «значение», входящее в свойство SET, не TRUE, иначе пусть модель предметной области имеет свое текущее значение
set
{
_domainModel.Mode = (value == true) ? <domain property to set> : _domainModel.Mode;
}
Другим важным моментом является то, что этот тип привязки радиокнопок работает только тогда, когда для Binding.DataSourceUpdateMode
установлено значение OnValidation
, которое используется по умолчанию. При изменении на OnPropertyChanged
последовательность срабатывания событий свойств при переключении с одной кнопки на другую ведет себя таким образом, что не позволяет оценить правильное значение свойства для кнопки, к которой перемещается элемент управления. Но DataSourceUpdateMode практически не изменяется в обычных приложениях, и, к счастью, это будет работать для большинства приложений с двумя или более радиокнопками.
(Я видел, что этот вопрос получил хорошие мнения, но ответа пока нет. Поэтому я подумал, что должен поделиться тем, что я наконец-то сделал, чтобы решить эту проблему.)