Create view object in ViewModel

c#, commandbinding, mvvm, wpf

Solution

You are right that generally you should never access views from view models. Instead in WPF, we set the `DataContext` property of the view to be an instance of the relating view model. There are a number of ways to do that. The simplest but least correct is to create a new WPF project and put this into the constructor of `MainWindow.xaml.cs`:

DataContext = this;

In this instance the 'view model' would actually be the code behind for the `MainWindow` 'view'... but then the view and view model are tied together and this is what we try to avoid by using MVVM.

A better way is to set the relationship in a `DataTemplate` in the `Resources` section (I prefer to use `App.Resources` in `App.xaml`:

<DataTemplate DataType="{x:Type ViewModels:YourViewModel}">
    <Views:YourView />
</DataTemplate>

Now wherever you 'display' a view model in the UI, the relating view will automatically be shown instead.

<ContentControl Content="{Binding ViewModel}" />

A third way is to create an instance of the view model in the `Resources` section like so:

<Window.Resources>
    <ViewModels:YourViewModel x:Key="ViewModel" />
</Window.Resources>

You can then refer to it like so:

<ContentControl Content="{Binding Source={StaticResource ViewModel}}" />

Problem

I have the following code in my C# WPF MVVM application. ``` public RelayCommand PolishCommand { get { polishcommand = new RelayCommand(e => { PolishedWeightCalculatorViewModel model = new PolishedWeightCalculatorViewModel(outcomeIndex, OutcomeSelectedItem.RoughCarats); PolishedWeightCalculatorView polish = new PolishedWeightCalculatorView(model); bool? result = polish.ShowDialog(); if (result.HasValue) { ``` But i came to know that, calling a window from viewmodel is wrong one in MVVM pattern. Also stated in the below link. M-V-VM Design Question. Calling View from ViewModel Please help me anybody by providing an alternate solution. Thanks in advance.

Original source

Related problems