ViewModel диалогового окна должна реализовывать интерфейс IDialogAware

#c# #wpf #.net-core #mvvm #prism

#c# #wpf #.net-core #mvvm #призма

Вопрос:

Я новичок в мире программирования на c #, и я сталкиваюсь с этой проблемой, когда пытаюсь разработать приложение, чтобы предупредить пользователя перед любым действием. Я использовал диалоговое окно, как в html. В моей MainWindowsViewModel существует метод открытия диалогового окна с использованием диалоговой службы prism mvvm в wpf. Но при отладке я получаю ошибку, указанную выше.

 public void DialogOpen()
    {
        var message = "This is a message that should be shown in the dialog.";
        _dialogService.ShowDialog("DialogView", new DialogParameters($"message={message}"), r =>
        {
            if (r.Result == ButtonResult.None)
                Title = "Result is None";
            else if (r.Result == ButtonResult.OK)
                Title = "Result is OK";
            else if (r.Result == ButtonResult.Cancel)
                Title = "Result is Cancel";
            else
                Title = "I Don't know what you did!?";
        });
 

В моем app.xaml.cs

 protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterSerilog();
        containerRegistry.RegisterSingleton<ISnackbarMessageQueue, SnackbarMessageQueue>();
        containerRegistry.RegisterSingleton<IAppConfigurationService, AppConfigurationService>();
        containerRegistry.RegisterForNavigation<MainView>();
        containerRegistry.RegisterDialog<DialogView, DialogViewModel>();
        
    }
 

В DialogViewModel

 public class DialogViewModel : BindableBase, IDialogAware
{
    private DelegateCommand<string> _closeDialogCommand;
    public DelegateCommand<string> CloseDialogCommand =>
        _closeDialogCommand ?? (_closeDialogCommand = new DelegateCommand<string>(CloseDialog));

    private string _message;
    public string Message
    {
        get { return _message; }
        set { SetProperty(ref _message, value); }
    }
    private string _title = "Notification";
    public string Title
    {
        get { return _title; }
        set { SetProperty(ref _title, value); }
    }

    public event Action<IDialogResult> RequestClose;

    protected virtual void CloseDialog(string parameter)
    {
        ButtonResult result = ButtonResult.None;

        if (parameter?.ToLower() == "true")
            result = ButtonResult.OK;
        else if (parameter?.ToLower() == "false")
            result = ButtonResult.Cancel;

        RaiseRequestClose(new DialogResult(result));
    }
    public virtual void RaiseRequestClose(IDialogResult dialogResult)
{
    RequestClose?.Invoke(dialogResult);
}

public virtual bool CanCloseDialog()
{
    return true;
}

public virtual void OnDialogClosed()
{

}

public virtual void OnDialogOpened(IDialogParameters parameters)
{
    Message = parameters.GetValue<string>("message");
}
}
 

Комментарии:

1. Существует множество способов отображения диалогового окна сообщения в контексте MVVM без необходимости реализации специального интерфейса — я представил одну методологию в сообщении в блоге peregrinesview.uk/mvvm-message-dialogs

Ответ №1:

В xaml вашего диалогового окна убедитесь, что у вас есть ViewModelLocator .Для AutowireViewModel установлено значение true в заголовке UserControl.

Смотрите Ниже пример заголовка для справки:

 <UserControl x:Class="MyProject.Views.TestDialog"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:MyProject.Views"
         xmlns:mvvm="http://prismlibrary.com/"
         mvvm:ViewModelLocator.AutoWireViewModel="True"
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="800">
         
         .....