Offer
Offer

Reputation: 630

Lack of knowledge to initializing viewmodel

Okay. So what I need to do is to initialize a ViewModel using a constructor. The problem is I can't create the constructor due lack of knowledge. I'm new to MVVM (or c# in general for that matter) and had to get some help to implement this code:

public class ViewModel
{
  private static ViewModel instance = new ViewModel();

  public static ViewModel Instance
  {
     get
     {
        return instance;
     }
  }
}

However, I fail to create a constructor to place this code.

DataContext = ViewModel.Instance

It is meant to go into two different pages to pass a value between TextBoxes. I'm also confused as to whether I should put the ViewModel in both the main window and the page or in just one of the two.

So, anyone can help?

Upvotes: 1

Views: 2424

Answers (3)

FearlessCoward
FearlessCoward

Reputation: 347

If you or anybody else, who's new to the MVVM, gets stuck here, for example at the "INotifyPropertyChanged could not be found". I recommend trying some example-MVVM's or tutorials.

Some I found useful:

Upvotes: 0

G.Y
G.Y

Reputation: 6159

Follow this pattern:

This part is how your model classes should look like, Even if you use entity framework to create your model they inherit INPC.. so all good.

public class Model_A : INotifyPropertyChanged
{
   // list of properties...
   public string FirstName {get; set;}
   public string LastName {get; set;}
   // etc...
}

each view model is a subset of information to be viewed, so you can have many view models for the same model class, notice that in case your make the call to the parameter-less c-tor you get auto instance of a mock model to be used in the view model.

public class ViewModel_A1 : INotifyPropertyChanged
{
  public Model_A instance;

  public ViewModel()
  {
     instance = new instance
     { //your mock value for the properties..
       FirstName = "Offer",
       LastName = "Somthing"
     };
  }

  public ViewModel(Model_A instance)
  { 
    this.instance = instance;
  }
}

And this is for your view, if you view in the ide designer you will have a mock view model to show.

public class View_For_ViewModelA1
{
  public View_For_ViewModel_A1()
  {
     //this is the generated constructor already implemented by the ide, just add to it:
     DataContext = new ViewModel_A1();

  }

  public View_For_ViewModel_A1(ViewModel_A1 vm)
  {
    DataContext = vm;
  }
}

XAML Side:

<Window x:Class="WpfApplication1.View_For_ViewModel_A1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:ViewModel="clr-namespace:WpfApplication1"
    mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"
    d:DataContext="{d:DesignInstance ViewModel:ViewModel_A1, IsDesignTimeCreatable=True}"
    Title="Window1" Height="300" Width="300">
    <Grid>
       <TextBox Text="{Binding FirstName}" />
       <TextBox Text="{Binding LastName}" />
    </Grid>
</Window>

In a more advanced scenario you would want to have a single view model class to relate to several model classes.. but you always should set a view to bind to a single view model. if you need to kung-fu with your code - make sure you do that in your view model layer. (i.e. creating a view-model that have several instances of different model types)

Note: This is not the complete pattern of mvvm.. in the complete pattern you can expose command which relate to methods in your model via your view-model and bind-able to your view as well. Good luck :)

Upvotes: 3

JBrooks
JBrooks

Reputation: 10013

I basically follow this pattern:

    public class ViewModelWrappers
    {
        static MemberViewModel _memberViewModel;
        public static MemberViewModel MemberViewModel
        {
            get
            {
                if (_memberViewModel == null)
                    _memberViewModel = new MemberViewModel(Application.Current.Resources["UserName"].ToString());

                return _memberViewModel;
            }
        }
...
}

To bind this to a page is:

DataContext = ViewModelWrappers.MemberViewModel;

And if I'm using more than 1 ViewModel on the page I just bind to the wrapper.

DataContext = ViewModelWrappers;

Upvotes: 0

Related Questions