i faced with some problems when designing architecture of my extensible programm.
I'm using MEF, MMVM Light Toolkit and AvalonDock.
The first problem is how display view for some ViewModel
imported from another assembly using MEF.
To solve it, i'm exporting ResourceDictionary
where i'm defining DataTemplate
's for views declared in this assembly.
Dictionary
:
<ResourceDictionary
...>
<DataTemplate DataType="viewmodels:MyViewModel">
<views:MyViewForViewModel/>
</DataTemplate>
</ResourceDictionary>
And in constructor of MainWindow
i'm importing all ResourceDictionaries
and merging them with MainWidow.ResourceDictionary
.
Is it good? It's also possible to specify 'scope' of ResourceDictionary
to import it not to MainWindow
, but to Application
for example.
The second problem is ICommands
and CommandBindings
.
To populate Menu
i'm exporting 'MenuItems' where i'm defining ICommand
, Text
and other stuff, but i don't know how to export CommandBinding
, should i use RelayCommand
for cases when i can't create CommandBinding
?
The third problem is dialogs.
I found great article Showing Dialogs When Using the MVVM Pattern and easily adapt it to MEF. But, for example, I have an IDatabaseService
which don't have any View.
The Workspace
, main ViewModel, storing instance of IDatabaseService
and creating menu item: Connect to Database
. Using IDialogService Workspace opening some imported IConnectToDbDialog
so Workspace
don't know anything about it. When dialog closed, the SqlConnectionString
should be passed to IDatabaseService
.
So who must pass this SqlConnectionString
, IConnectToDbDialog
or Workspace
.
The fourth problem is how to communicate with IDatabaseService
correctly.
For example. In some View i have Button
: 'Create Item In Database'. And how should i call IDatabaseService
method CreateItem(ElementType elementType)
when button clicked?
The problem, that there are a lot of buttons which create Items
with different ElementType
in database, so, i think, it's right to create some ICommand
with parametr and create only one handler for this command which will invoke some method in IDatabaseService
. But i don't know how.
The other solution is to send messages to IDatabaseService
from ViewModel
to create item.
which way better?