У нас есть приложение WPF с целевой страницей, которая содержит около дюжины кнопок, и все они переходят к новым представлениям / моделям просмотра этого типа. Это становится громоздким. У нас есть одна модель представления, которая перечисляет все из них, которые в основном выглядят так:
private void ExecuteViewProgramCommand()
{
OpenViewMessage message = new OpenViewMessage();
CurrentViewModel = message.ViewModel = ViewModelLocator.ProgramVM;
Messenger.Default.Send<OpenViewMessage>(message);
}
Мне никогда не нравилось, как это было сделано, поскольку это нарушает принцип DRY. Единственное, что изменяется в приведенном выше коде во второй строке, где в этом коде то, что изменяется, это ViewModelLocator.ProgramVM
. Мне было поручено переделать целевую страницу, сделать ее более организованной, и мы собираемся добавить больше кнопок запуска. Я думаю, что было бы лучше использовать внедрение зависимости. Также я пытаюсь решить вопрос о необходимости изменить дизайн дисплея, чтобы он отображался в списке, а не в разбросанных по алфавиту кнопках и в алфавитном порядке.
Сначала я придумал этот класс:
public class Tile
{
public string ModuleName { get; set; }
public NamedViewModelBase ModuleViewModel { get; set; }
}
(NamedViewModelBase - это имя модели представления, которая является общей для всех моделей представления.) Затем я объявил модульный тест для проверки этого и объявил это в модульном тесте:
List<Tile> tiles = new List<Tile>()
{
new Tile()
{
ModuleName = "Program",
ModuleViewModel = ViewModelLocator.ProgramVM
},
new Tile()
{
ModuleName = "Organization",
ModuleViewModel = ViewModelLocator.OrganizationVM
}
}
Но это быстро стало очевидно, что это неправильно. Присваивание в установщике ViewModelLocator.ProgramVM
создаст экземпляр модели представления для Программы. Я не хочу этого, я бы предпочел вызвать его создание, как, например, в ViewModelLocator:
static public ProgramViewModel ProgramVM
{
get
{
if (ServiceLocator.IsLocationProviderSet)
{
SimpleIoc ioc = ServiceLocator.Current as SimpleIoc;
return ioc.GetInstanceWithoutCaching<ProgramViewModel>(Guid.NewGuid().ToString());
}
else
{
return null;
}
}
}
Итак, я думаю, что мне нужно изменить Tile Класс для объявления свойства ModuleViewModel примерно так: public NamedViewModelBase ModuleViewModel { get; }
. Но я не знаю, как бы я его реализовал при определении списка. Как правильно решить эту проблему?