Диалоговый пример WPF MVVM

% Соответствует любому количеству символов _ Соответствия отдельный символ

, я никогда не использовал Полнотекстовое индексирование, но можно выполнить довольно сложные и быстрые поисковые запросы с простым использованием сборки в строковых функциях T-SQL.

28
задан Oll 3 November 2009 в 15:05
поделиться

5 ответов

The way I do this is using the mediator pattern also. When the ViewModel wants to show a dialog, it sends a message which is picked up by the application's main window. The message contains an instance of the ViewModel used by the dialog.

The main window then constructs an instance of the dialog window, passes the view model to it and shows the dialog. The result of the dialog is passed back to the caller in the original message.

It looks something like this:

In your view model:

DialogViewModel viewModel = new DialogViewModel(...);
ShowDialogMessage message = new ShowDialogMessage(viewModel);

_messenger.Broadcast(message);

if (message.Result == true)
{
    ...
}

In the main window codebehind:

void RecieveShowDialogMessage(ShowDialogMessage message)
{
    DialogWindow w = new DialogWindow();
    w.DataContext = message.ViewModel;
    message.Result = w.ShowDialog();
}

I hope this is enough to give you the idea...

13
ответ дан 28 November 2019 в 03:30
поделиться

Как я понял ваш комментарий выше, вопрос не в столько о показе диалогов, сколько о их скрытии. Есть два способа решить эту проблему:

  1. Использовать стандартное диалоговое окно для реализации представления. Для этого потребуется слабосвязанный способ связи между View и ViewModel, чтобы ViewModel мог уведомить View о том, что его можно закрыть, не имея ссылки на представление.

    Существует несколько структур, которые позволили бы это сделать - агрегаторы событий Prism могут быть одним из них. В этом сценарии View подписывается на событие (скажем, MyDialogResultValidated), и при получении события он будет устанавливать DialogResult соответствующим образом. ViewModel (в своей команде SaveCommand) запустит событие, если проверка прошла успешно.

  2. Не использовать стандартное диалоговое окно для реализации представления. Для этого потребуется наложение, которое эффективно имитирует модальность.

    В этом сценарии видимость представления и наложения будет привязана к свойству IsVisible ViewModel, которое будет установлено соответствующим образом реализацией SaveCommand или всякий раз, когда ViewModel должен отображать представление.

Первый подход потребует наличия небольшого количества кода в коде программной части, требует добавления глобальных событий и (возможно) менее похож на MVVM. Второй подход потребует реализации (или использования чужой реализации) наложения, но не требуют ни кода в коде-позади, не потребует имеющих глобальное событие (я), и (спорно) более MVVM иш.

2
ответ дан 28 November 2019 в 03:30
поделиться

Я бы использовал службу для отображения диалогового окна. Затем служба может также связывать представления с моделями просмотра.

public interface IDialogService {
    void RegisterView<TView, TViewModel>() where TViewModel:IDialogViewModel;
    bool? ShowDialog(IDialogViewModel viewModel);
}

public interface IDialogViewModel {
    bool CanClose();
    void Close();
}


RegisterView просто связывает тип представления с типом ViewModel. Вы можете настроить эти ссылки при инициализации модуля. Это проще, чем пытаться заставить модули регистрировать шаблоны данных на верхнем уровне вашего приложения.

ShowDialog Показывает ViewModel, который вы хотите отобразить. Он возвращает true, false и null для закрытия, как и метод Window.ShowDialog . Реализация просто создает новое представление типа TView из вашего контейнера, подключает его к предоставленной ViewModel и показывает его.

IDialogViewModel предоставляет механизм для ViewModel для проверки и отмены закрытия диалогового окна.

У меня есть стандартное диалоговое окно с элементом управления содержимым в этом. Когда вызывается ShowDialog , он создает новый стандартный диалог, добавляет представление к элементу управления содержимым, подключает ViewModel и отображает его. В стандартном диалоговом окне уже есть кнопки [OK] и [Cancel] с соответствующей логикой для вызова правильных методов из IDialogViewModel .

Когда вызывается ShowDialog , он создает новый стандартный диалог, добавляет представление к элементу управления содержимым, подключает ViewModel и отображает его. В стандартном диалоговом окне уже есть кнопки [OK] и [Cancel] с соответствующей логикой для вызова правильных методов из IDialogViewModel .

Когда вызывается ShowDialog , он создает новый стандартный диалог, добавляет представление к элементу управления содержимым, подключает ViewModel и отображает его. В стандартном диалоговом окне уже есть кнопки [OK] и [Cancel] с соответствующей логикой для вызова правильных методов из IDialogViewModel .

23
ответ дан 28 November 2019 в 03:30
поделиться

Другие люди указали вам на формальные правила нормализации. Вот несколько неофициальных рекомендаций, которые я использую:

  1. Если у вас есть столбцы в таблице, названия которых отличаются только числом (например, Phone1 и PHone2).

  2. Если у вас есть какие-либо столбцы в таблице, которые следует заполнить только когда заполнен другой столбец в таблице.

  3. Если для обновления «факта» в базе данных (например, почтового адреса) требуется более одного ОБНОВЛЕНИЯ.

  4. Если один и тот же вопрос может когда-либо получить два разных ответа в зависимости от из какой таблицы вы получаете информацию.

  5. Если ответ на любой нетривиальный вопрос может быть получен из базы данных без СОЕДИНЕНИЯ хотя бы двух таблиц.

  6. Если у вас есть какие-либо ограничения на основе количества в базе данных, кроме "разрешено только одно из чего-либо" (то есть "

0
ответ дан 28 November 2019 в 03:30
поделиться

It isn't Prism, but this MVVM demo has an Options Dialog that's fully MVVM.

0
ответ дан 28 November 2019 в 03:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: