One year ago, I discovered the WPF technology and I developed a little applicati
ID: 644006 • Letter: O
Question
One year ago, I discovered the WPF technology and I developed a little application, as first experiment, to compare the content of two different directories. The content of each directory is shown in a different DataGrid. At that time, I didn't develop the application using MVVM pattern, because it was only an experiment, not so good, but it worked.
Now that I've much more experience with WPF and with the design patterns, I'm not so proud of that work, and I want to rewrite the application, improving it and following the recommended MVVM pattern.
Actually, I designed the application in this way:
the MainModel, with the main common algorithm.
the MainView is the unique view of the application with the datagrids where I can show the results of my algorithms.
a MainViewModel, that it will take care of handling the connection between other two ViewModels, the MainModel and the MainView.
One ViewModel for each DataGrid. In this way, I'll separate the behavior and the data of the two DataGrids.
The MainModel contains the main algorithm used to search the files in a given directory, like this:
public class MainModel
{
public MainModel()
{}
public List<Results> GetFiles(string directoryPath)
}
The MainViewModel will instantiate an object for each ViewModel (I have a ViewModel for each datagrid), using some properties to do it:
public class MainViewModel
{
public MainViewModel()
{
FirstViewModel = new ViewModelDG1();
SecondViewModel = new ViewModelDG2();
}
public ViewModelDG1 FirstViewModel
{get;set;}
public ViewModelDG2 SecondViewModel
{get;set;}
}
I wanted to apply a design pattern to help me manage the application, like a Factory Method or Builder, or a Template Method, but I think they're not suitable for my application for the different usages/conditions of those design patterns.
I'm not so sure of this design, I don't know if this a is correct implementation of the MVVM pattern and if it promotes a loose coupling and high cohesion. Can you help me in the design? Is mine a correct implementation of the MVVM? If not, then what is the correct one? What are your opinions?
Thank you.
Explanation / Answer
Alberto, about one and a half years ago I was where you are now, and I've learned a lot about MVVM, WPF and Programming Meta Skills on the way.
For the time being, I will refrain from answering your questions specifically, and like to get a few words out that are of general interest/guidance, if you will.
MVVM is a design/architectural pattern that takes some time getting used to. There is no one right or correct way, MVVM is practiced in many different flavors with strictly no code-behind on the one side, and a more "integrated view model"-like approach (with a certain amount of code-behind allowed) on the other side. As with many things in IT, this topic also borders on personal liking.
Don't make the mistake I made by trying to push in patterns (or someone else's design liking) for patterns' sake. Recognize your specific problems, and try to solve them one at a time. See how other WPF/MVVM experts are solving and buildings things. By recognizing a problem and finding a way to solve it, you learn your MVVM/WPF skill by heart. Many small steps will get you in the right direction faster than any doggedly "I'm trying to get this 100% correct the first time" approach.
Now to your question:
I cannot see any problem with your approach so far. The only things I'd like to comment on are:
Instantiate your VMs via lazy loading, so that they consume memory/processing time only on-demand. Also, if you're allowing re-setting your view model objects (see your setters), please make sure that the container class implements INotifyPropertyChanged.
public ViewModelDG2 SecondViewModel { get { return _viewModelDG2 ?? (_viewModelDG2 = new ViewModelDG2()); } }
As for your "loose coupling" concern: That one is more about providing interfaces to your specific implementation (classes). If the view is created in a different assembly, it might make sense to operate via internal classes and public interfaces.
Resources I can warmly recommend to you:
MVVM Survival Guide for Enterprise Architectures in Silverlight and WPF
Developer's Guide to Microsoft Prism 4 Building Building Modular MVVM Applications
Pro WPF and Silverlight MVVM
Best!
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.