DialogService 在 ShowDialog 中将 Object 作为参数传递

Posted

技术标签:

【中文标题】DialogService 在 ShowDialog 中将 Object 作为参数传递【英文标题】:DialogService pass Object as parameter in ShowDialog 【发布时间】:2021-10-04 14:36:29 【问题描述】:

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

private void ExecuteOpenDialog(SOItem soItem)

    System.Diagnostics.Debug.WriteLine(soItem.Name);
    ShowDialog(soItem);

看起来DialogParameters 只是strings?对吗?

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 作为参数传递给我的对话框吗?

【问题讨论】:

【参考方案1】:

首先,创建一个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"](返回 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");
   

【讨论】:

太棒了!谢谢你。这正是我正在寻找的。我在ScrollViewer 中有一个ItemsControl。我的DataTemplate 是一个自定义控件,它有按钮。那些打开对话框的按钮,我正在为对话框发送实际点击的SOItem

以上是关于DialogService 在 ShowDialog 中将 Object 作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章

有时显示对话框得到“onSaveInstanceState 后无法执行此操作”

MudBlazor:单击“确定”按钮时防止关闭 MudDialog

如何最小化启动对话框?

如何在 Vue 3 中以编程方式创建组件实例?

弹出窗口中的 Xamarin.Forms 日期选择器

读取文件夹底下的所有文件,异步,同步,double双精度控制小数位,进度条用法