Эти решения действительно не должны приниматься в графическом интерфейсе. Вы должны иметь ViewModel позади вашего GUI, который принимает эти решения, и для которого вы пишете модульные тесты. (Или Presenter, или Controller - разные имена, которые означают примерно одно и то же: вывести решения из класса GUI и сделать что-то, что вы можете тестировать модулем.)
Тогда ваша ViewModel будет иметь, например, логическое свойство для каждого элемента, который будет отключен GUI, и метод для каждого действия, которое вы можете предпринять (CloseCustomerAccount () или что-то еще).
Пока форма создается для определенного типа клиента, и клиент не будет переходить на другой тип клиента в течение срока действия формы, вы можете просто передать свой объект Customer (в котором хранятся все фактические данные о клиенте) в конструктор ViewModel, а затем передайте вашу ViewModel в конструктор вашей формы. Форма может установить все свои свойства Enabled сразу после вызова InitializeComponent (). С другой стороны, если тип клиента может измениться, то вашей ViewModel необходимо предоставить некоторые события для перехвата формы, чтобы форма знала, когда следует повторно запустить логику «Включение».
Ваш вопрос затем перемещается из формы в ViewModel. Есть ли у вас один класс ViewModel с кучей операторов case или три класса ViewModel (возможно, с четвертым, который является базовым классом), которые используют полиморфизм, и метод фабрики, который где-то решает, основываясь на конкретном клиенте, какой класс ViewModel создать для экземпляра
Я бы позволил, чтобы ваш код был там руководством. Начните с самого простого подхода, который, вероятно, является падежом. Напишите юнит-тест для каждого интересующего вас поведения. Если операторы case начинают становиться слишком неудобными, добавьте потомок ViewModel для каждого типа клиента и начните извлекать операторы case в виртуальные методы. Ваши тесты поймают вас, если вы сделаете ошибку во время рефакторинга.