不久前,我写了这个SO post寻找处理UI和业务层交互的好方法,我喜欢使用MVVM模式的答案。
所以我做得非常成功,但是我对使用这种模式的问题感到有些困惑。实际上,在我的UI的某些部分,我的一个按钮应该打开一个对话框,其中包含ListView
中显示的项目的详细信息。
我看到这个SO post询问同样的问题,但我不太明白答案,我想知道它是否适合我的情况。我们的想法是使用Unity框架,并使用App.Container.Resolve<MyChildView>().ShowDialog()
调用与存储库中的视图关联的窗口。
但是,我的问题是我在项目中实现了与UI客户端项目分开的ViewModel。我这样做是为了能够在项目的后期阶段使用来自其他客户端的VM。第一个问题,是模式的错误实现吗?
第二个问题,因为我的ViewModels项目实际上并不在客户端的项目中,因此我无法访问App
全局变量。因此,我认为我不能使用前面提到的帖子中找到的解决方案。有没有解决方法?
答案 0 :(得分:1)
1)你的实施完全没有错。我经常将UI,VM和模型分成不同的程序集。
2)正如您所提到的,在VM中引用App是不合适的。将App视为“UI类”并将其视为此类。您是否考虑过将适当的UnityContainer注入虚拟机?
如果您无法选择注入容器,请考虑按照您提到的SO post中的其他答案的建议,为您的解决方案添加控制器或使用Mediator模式。
答案 1 :(得分:0)
试试这个。设置一个新线程,初始化并显示您的窗口(您也可以使用ShowDialog()
而不是Show()
),然后通过调用Dispatcher.Run()
将线程转换为UI线程,这将阻塞直到窗户关闭了。然后,您可以随意处理对话框结果。
new Thread(() =>
{
MyDialogWindow m = new MyDialogWindow();
m.ShowDialog();
Dispatcher.Run();
// Handle dialog result here.
}).Start();
确保在关闭窗口时在对话框中添加事件,以使Dispatcher停止。将其添加到对话框的构造函数中:
Closed += (_,__) => Dispatcher.InvokeShutdown();