如何为从视图模型打开的对话框设置所有者?

19 浏览
0 Comments

如何为从视图模型打开的对话框设置所有者?

我有一个父视图,显示一个网格。在其中一列中,每一行都有一个按钮,用来显示一个子对话框,以编辑每一行网格所绑定的对象。按钮绑定到视图模型上的一个命令,用于显示对话框。我使用CommandParameter="{Binding}"将要编辑的对象的引用传递给子对话框的视图模型。

我希望对话框相对于打开它的窗口居中显示,我可以使用dialog.WindowStartupLocation = WindowStartupLocation.CenterOwner,但是我需要一个对父窗口的引用。

我能想到两种解决方案,但我认为它们都不够简洁。

  1. 如果我还没有使用命令参数,我可以像这样将窗口传递给父视图模型:CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}"。我可以使用多绑定和转换器来传递两个参数,但这是一个好的做法吗?我倾向于认为视图模型不应该知道任何关于视图的东西。
  2. 我可以将承载父视图的父窗口的引用传递给它的视图模型,放在视图模型的构造函数中。同样,我不喜欢的是,视图模型知道窗口,这似乎是一个错误方向上的依赖。

我对这两种方法的另一个不满意之处是父视图模型需要知道它正在创建的子窗口。

我看到了这个答案,展示了如何使用一个服务,让视图模型可以打开一个窗口,而不需要知道它所创建的窗口的任何信息,这很棒,但我无法想到一种不通过视图模型传递父窗口的简洁方法。

0