DialogService 在 ShowDialog 中将对象作为参数传递

DialogService pass Object as parameter in ShowDialog

我想在 Prism WPF 中打开一个对话框。在我的 ViewModel 中执行一个名为 ExecuteOpenDialog 的命令,它会得到一个名为 soItemCommandParameter。我想将此参数传递给我的对话框。

private void ExecuteOpenDialog(SOItem soItem)
{
    System.Diagnostics.Debug.WriteLine(soItem.Name);
    ShowDialog(soItem);
}

看起来 DialogParameters 只是 string?是吗?

private void ShowDialog(SOItem soItem)
{
    var message = msg;
    //using the dialog service as-is
    _dialogService.ShowDialog(typeof(DialogWindow).Name, new DialogParameters(soItem), 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!?";
    });
}

知道如何将我的 SOItem 作为参数传递到我的对话框吗?

首先,创建一个 DialogParameters 实例并使用 Add 方法添加带有密钥的 soItem。构造函数 DialogParameters 是一个 查询 ,您只能在其中添加字符串值。

private void ShowDialog(SOItem soItem)
{
   var message = msg;
   //using the dialog service as-is
   var dialogParameters = new DialogParameters();
   dialogParameters.Add("MyItem", soItem);

   _dialogService.ShowDialog(typeof(DialogWindow).Name, dialogParameters, 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!?";
   });
}

或者,您可以使用集合初始化器来添加键值对。

var dialogParameters = new DialogParameters
{
   {"MyItem", soItem}
};

在对话视图模型中实现 IDialogAware 接口。打开对话框时会触发 OnDialogOpened 覆盖。在那里,您可以使用索引器 parameters["MyItem"](returns 和 object)或将项目转换为所需类型的通用 GetValue<T> 方法获取对话框参数。

public class MyDialogViewModel : BindableBase, IDialogAware
{

   // ...other code, overrides, properties.

   private SOItem _soItem;
   public SOItem SOItem
   {
      get => _soItem;
      set => SetProperty(ref _soItem, value);
   }

   public virtual void OnDialogOpened(IDialogParameters parameters)
   {
      SOItem = parameters.GetValue<SOItem>("MyItem");
   }
}