WPF use one ViewModel for multiple UserControls - wpf

I've searched a lot for an answer for this question, but couldn't quite find an answer.
I have my main Window and 4 different UserControls. The Window is constructed from all 4 UserControls.
I have a class which is the Window's ViewModel.
I wish to set the DataContext of the Window and all 4 UserControls as the Window's ViewModel.
The problem is that writing the class as the control's DataContext creates a new instance of the class, hence, I can't use the containers I'm filling.
Any way of doing that?

DataContext gets inherited in WPF.
If you don't set a DataContext for the UserControl, they will automatically inherit their parent's DataContext (the Window), and should use your ViewModel directly.

Related

WPF Prism Unity Container. Setting keyboard focus on usercontrol or usercontrol grid parent

I'm working on a project that utilizes WPF, using the Prism library and Unity Container.
I have a mainwindow, which contains a mainviewmodel control which in turn is populated by a collection of user controls.
My goal is to set keyboard focus to the mainviewmodel where I have an EventTrigger InvokeCommandAction which reacts to keyeventsargs...
Currently the only way the command is fired if I use a textbox within the control (or child controls). My goal is to have the mainviewmodel control or grid get and preserve keyboard focus.
Any tips would be appreciated!
//Nathan
Either not understanding your question correctly or you should review the basic concepts of MVVM in a WPF implementation.
The View is the WPF controls.
WPF Window/UserControl files contain WPF markup which is the View.
Controls in a view leverage DataBindings to the DataContext property of either the control itself or the parent containing control (which it will inherit).
DataContext property is set to an instance of an object that is the ViewModel. It contains properties to hold values and commands to execute actions.
So conceptually there is no "mainviewmodel control", there is a MainView which contains controls and may in this case have its DataContext property set to an instance o MainViewModel. (hence my confusion)
Finally, while it is possible and some might even recommend writing UI rules/logic in a view model I haven't found much benefit in it.
You are much better off putting UI logic in the XAML or in the MinView code behind. You can still access the MainViewModel in the code behind by casting the MainView.DataContext property as a MainViewModel.
So for example:
MainView.KeyDown event can be wired up to call MainViewModel.CommandX.Execute();

How to detect changes between two usercontrols?

I have a main window that contains two usercontrols.
The first usercontrol have a tabcontrol.How can I notify the second usercontrol when a tabitem is selected in the first usercontrol.
If you're using MVVM approach, you'll probably have bound SelectedIndex of your TabControl to a ViewModel property. In that case your second usercontrol will bind to the same (or some other) property of the ViewModel and will be notified through standard notification mechanisms (such as INotifyPropertyChanged or DependencyProperty etc.).
In case, you are not using ViewModels and coding directly behind your Window, you can listen to SelectionChanged event and update your second usercontrol therein.

How to change parent control from child in MVVM WPF?

i have a problem with WPF MVVM, i have one usercontrl loaded inside my main view.. And at my main view i have a status bar and one textbox. I want to change the text by clicking at button from usercontrol, how can i do that? I tried a lot os things here like raisedpropertiechange and nothing happens.
I have one ViewModel from MainModel and a lots of UserControls with theirs viewmodels. Each usercontrl viewmodel will have one button with need to be fired and change the text from parent Model.
Im not sure if im clear about this.
Regards
I would provide a command in the BaseClass of the UserControl viewmodel, which changes the text in the parent viewmodel of the UserControls viewmodel. The Buttons of the UserControl can bind to this command. And the title of the main view is bound to the text property.
Keep the views and controls as decoupled and 'stupid' as possible.
Then you only have to provide a reference of the main viewmodel in the other viewmodels.

Retrieves value from Wpf UserControlLibrary to WpfForm

In my WPF application, I have a usercontrol library. In this library, I have a listview control along with textbox and button controls.
I have placed this usercontrol in a WPF window form. How can I retrieve the listviewitems of my usercontrol in this WPF window form?
You ask a very general question. There are dozens of ways to do that, depends on your needs. For example: when you place you UserControl within the Window - you should name it (e.g. . Then, within the UserControl, you can have a public function, or a public getter, which will return the items (it is the 'Items' property of the ListView).
Another way is binding. If you have a ViewModel, or any other class as the DataContext, you can bind the ItemsSource of the ListView to a collection on your ViewModel. Unless you change the DataContext of the UserControl - it will have the same DataContext as the main Window.

WPF/MVVM:Set multiple datacontext to ONE usercontrol

I have a UserControl with 5 small UserControl which are parts of the first UserControl.
The first UserControl is datatemplated by a MainViewModel type.
The other 5 small UserControls have also set the DataContext to this MainViewModel type.
Now I want additionally that those 5 UserControls get a 2nd DataContext to access other public
properties of another ViewModel .
How can I do that?
I don't believe that you can have multiple DataContexts set for any given control.
So, depending on what exactly you're looking to do, you could:
a) Just set the DataContext for the 5 sub controls to the 2nd DataContext type
or
b) Create another ViewModel that inherits from your MainViewModel and also includes all the extra properties you need for the 5 sub controls. This would be in the case where you require everything from the MainViewModel AND the 2nd view model.
I guess you could also modify your main ViewModel to access properties on a subviewmodel, but this is all quite speculative without knowing what you're actually aiming to do.
Hope that helps :)

Resources