A little while ago, I wrote this SO post looking for a good way to handle UI and business layer interaction, and I liked the answer which was to use the MVVM pattern.
So I did so quite successfully, but I'm a bit stuck with a problem using this pattern. Indeed, in some part of my UI, one of my buttons is supposed to open a dialog with the details of an item displayed in a ListView
.
I saw this SO post asking about the same question, but I didn't quite understand the answer and I wonder if it is suitable in my case. The idea was to use the Unity framework and to call the window associated with the view in the repository using App.Container.Resolve<MyChildView>().ShowDialog()
, for example.
However, my problem is that I have implemented the ViewModels in project separate from the U开发者_如何学PythonI client project. I did this in order to be able to use the VMs from another client if need at a later stage of the project. First question, was that a wrong implementation of the pattern?
Second question, as my ViewModels project isn't actually in the client's project, and hence I do not have access to the App
global variable. Therefore, I don't think I can use the solution I found in the previously mentioned post. Is there any workaround?
1) Your implementation is not wrong at all. I regularly separate UI, VM, and models into separate assemblies.
2) As you mentioned, it isn't appropriate to reference App within a VM. Consider App a "UI class" and treat it as such. Have you considered injecting the appropriate UnityContainer into your VM?
If injecting the container isn't an option for you, think about adding a controller to your solution or using the Mediator pattern as suggested by other answers in that SO post you mentioned.
Try this. Set up a new thread, initialize and show your window (You can also use ShowDialog()
instead of Show()
), and then convert the thread to a UI thread by calling Dispatcher.Run()
which will block until the window is closed. Then, afterwards, you can handle the dialog result however you want.
new Thread(() =>
{
MyDialogWindow m = new MyDialogWindow();
m.ShowDialog();
Dispatcher.Run();
// Handle dialog result here.
}).Start();
Be sure to add an event in your dialog for when you close the window, to have the Dispatcher stop. Add this to your constructor of the dialog:
Closed += (_,__) => Dispatcher.InvokeShutdown();
精彩评论