MVVM - закрытие вкладки при удалении записи
Я не совсем уверен, как сделать это лучшим способом MVVM...
По сути, мое основное приложение открывает окно поиска, в котором отображаются все записи в TabPanel. Затем, если дважды щелкнуть запись, открывается новая вкладка с этой записью. Сейчас я пытаюсь сохранить MVVM, но не могу понять, как закрыть табу графического интерфейса, когда человек удаляет запись (зачем держать ее открытой, если запись исчезла).
Единственный способ выяснить, как это сделать сейчас, - передать экземпляр TabItem в качестве параметра DeleteCommand, который мне кажется большим "нет-нет", но я не могу понять, насколько я понимаю как это сделать.
2 ответа
Если вы собираетесь сделать это в истинном смысле MVVM, то двойной щелчок по записи за кулисами добавит запись в коллекцию записей. Эта коллекция записей является источником данных для вкладок в вашем элементе управления. Просто удалив этот элемент из списка (обычно ObservableCollection<T>
) приведет к обновлению пользовательского интерфейса и удалению вкладки.
Какой подход вы используете в настоящее время, чтобы показать вкладку?
Изменить (в ответ на комментарий):
Это не "настоящий" MVVM. Не имеет значения, могут ли вкладки быть больше, чем просто записи. Вы должны создать модели представления, которые абстрагируют эти детали, а затем просто поместить экземпляры модели представления (RecordViewModel, ReportViewModel и т. Д.) В наблюдаемую коллекцию и связать ее с ней. Используйте шаблоны данных для визуализации правильных представлений для содержимого каждой вкладки в зависимости от типа модели представления, к которой привязана текущая вкладка.
Джош Смит написал потрясающую статью, описывающую, как работает MVVM. Пример приложения делает нечто очень похожее на то, что вы хотите сделать.
Приложение отображает TabControl, который отображает 1 или более рабочих пространств. Рабочая область отображает два разных типа элементов. Элементы вкладки закрыты. Посмотрите, я уверен, что это решит вашу проблему.
Приложения WPF с шаблоном проектирования Model-View-ViewModel