Я работаю над WPF-приложением, используя MVVM, где я повторно использую модель представления для просмотра/создания/редактирования/копирования бизнес-объекта (называемого потоком). В представлении есть около 25 полей, и некоторые из них должны быть отключены в зависимости от того, просматривает ли пользователь/редактирует/... поток. В попытке сохранить вид и модель представления чистой я придумал следующее решение:Как выборочно отключить элементы управления повторно используемой ViewModel в зависимости от варианта использования?
- Я использую перечислимую GuiAction, содержащий все различные
GuiAction
с (FlowView, FlowEdit, и т.д ..) - у меня есть свойство на модели представления потока типа GuiAction, который представляет ли мы просмотр/редактирование/..
Все поля на поток имеет свой
IsEnabled
атрибут DataBound к свойству GuiAction с преобразователемControlAvailability
взятия название свойства в качестве параметра:<CheckBox IsEnabled="{Binding GuiAction, Converter={StaticResource ControlAvailability}, ConverterParameter=Runnable}"></CheckBox>
ControlAvailability
получает как имя GuiAction, так и имя параметра, и из него он должен возвращать true или false, включение или отключение элемента управления.
Что касается логики в ControlAvailability
, моя первоначальная идея, чтобы посмотреть наличие было использовать оператор переключения двухуровневую следующим образом:
public object Convert(object value, ..., object parameter, ...)
{
GuiAction guiAction = (GuiAction)value;
string control = (string)parameter;
switch (guiAction)
{
case GuiAction.FlowView:
switch (control)
{
case "Runnable":
return false;
break;
case "Path":
return false;
break;
...
}
break;
case GuiAction.FlowEdit:
switch (control)
{
case "Runnable":
return true;
break;
...
}
break;
...
}
}
, но с 7 GuiActions и 25 управления это повернется в сотни строк кода. Я чувствую, что должен быть лучший способ сделать это .. возможно, где-то в плоском файле.
Итак .. Является ли массовое заявление о переключении способом выхода или есть лучшее решение?
Как насчет не повторно использовать ту же модель представления, но и создают определенную по одному для каждого действия? У класса должна быть только одна ответственность.Если один и тот же класс может использоваться во многих разных сценариях в зависимости от значений его свойств, ваш оператор switch неизбежно станет большим. – mm8
Одна из сильных сторон шаблона MVVM - это разделение, позволяющее повторно использовать режимы просмотра для разных видов. Наличие нескольких моделей представления потока для каждого сценария, из которых есть 7, означало бы, что любые модификации модели представления должны были бы выполняться 7 раз. Тогда я предпочел бы иметь большой переключатель где-то :) Я просто думаю, что если эта структура данных (по существу, двумерная матрица) может быть выражена более надежным способом. – jbb