#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">
.....