Jon Anderson
Jon Anderson

Reputation: 1

Trying to create MVVM ViewModelFirst with nested Views and nested ViewModels

I am new to using MVVM and am trying to find a reasonably elegant approach using a ViewModel First strategy while creating an interface of nested Views. I have taken a brute force stab at making a workable solution but I can't imagine this is an ideal way to handle this challenge. I have been unsuccessful in finding a solution in any forum. I have included some limited function bogus classes and code to demonstrate my working idea. Any help would be appreciated.

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows.Controls;


public class BogusStart
{
    public static Lesson GetLesson(int id)
    {
        //entity and children would be called from repository
        //return LessonRepository.Get(id)
        //.Include("Activity)
        //.Include("Activity.SubActivity)
        //.FirstorDefault();

        //Dummy Return
        return new Lesson();
    }
    public UserControl BuildLessonAndChildViews()
    {
        var _LessonViewModel = LessonViewModel.ViewModelFactory(GetLesson(1));
        var _LessonView = new LessonView();
        foreach (ActivityViewModel _ActivityViewModel in _LessonViewModel.ActivityViewModels)
        {
            var _ActivityView = new ActivityView();
            _ActivityView.DataContext = _ActivityViewModel;

            foreach (SubActivityViewModel _SubActivityViewModel in _ActivityViewModel.SubActivityViewModels)
            {
                var _SubActivityView = new SubActivityView();
                _SubActivityView.DataContext = _SubActivityViewModel;
                _ActivityView.ChildrenSP.Children.Add(_SubActivityView);
            }
            _LessonView.ChildrenSP.Children.Add(_ActivityView);
        }

        return _LessonView;


    }

}
public class Lesson
{
    public int id { get; set; }
    public string Title { get; set; }
    public string Desc { get; set; }
    public ICollection<Activity> Activities { get; set; }
}

public class Activity
{
    public int id { get; set; }
    public string Title { get; set; }
    public string Desc { get; set; }
    public int ScoreWeight { get; set; }
    public ICollection<SubActivity> SubActivities { get; set; }
}
public class SubActivity
{
    public int id { get; set; }
    public string Title { get; set; }
    public string Desc { get; set; }
    public int ScoreWeight { get; set; }
}


public class LessonViewModel
{
    public Lesson _Lesson { get; set; }
    public ObservableCollection<ActivityViewModel> ActivityViewModels { get; set; }
    public LessonViewModel(Lesson _lesson)
    {
        _Lesson = _lesson;


        foreach (Activity _Activity in _Lesson.Activities)
        {
            ActivityViewModels.Add(ActivityViewModel.ViewModelFactory(this, _Activity));
        }
    }
    public static LessonViewModel ViewModelFactory(Lesson _lesson)
    {
        return new LessonViewModel(_lesson);
    }
}
public class ActivityViewModel
{
    public Activity _Activity { get; set; }
    public LessonViewModel _LessonViewModel { get; set; }
    public ObservableCollection<SubActivityViewModel> SubActivityViewModels { get; set; }
    public ActivityViewModel(LessonViewModel _lessonViewModel, Activity _activity)
    {
        _Activity = _activity;
        _LessonViewModel = _lessonViewModel;

        foreach (SubActivity _subActivity in _Activity.SubActivities)
        {
            SubActivityViewModels.Add(SubActivityViewModel.ViewModelFactory(this, _subActivity));
        }
    }

    public static ActivityViewModel ViewModelFactory(LessonViewModel _lessonViewModel, Activity _Activity)
    {
        return new ActivityViewModel(_lessonViewModel, _Activity);
    }

}
public class SubActivityViewModel
{
    public SubActivity _SubActivity { get; set; }
    public ActivityViewModel _ActivityViewModel { get; set; }
    public SubActivityViewModel(ActivityViewModel _activityViewModel, SubActivity _subActivity)
    {
        _ActivityViewModel = _activityViewModel;
        _SubActivity = _subActivity;
    }
    public static SubActivityViewModel ViewModelFactory(ActivityViewModel _activityViewModel, SubActivity _subActivity)
    {
        return new SubActivityViewModel(_activityViewModel, _subActivity);
    }
}

///example of simple format for each view control
/// <Grid>
//    <StackPanel x:Name="MainSP" Orientation="Vertical">
//        <TextBlock Text = "{Binding id}" ></ TextBlock >
//        < TextBlock Text="{Binding Title}"></TextBlock>
//        <TextBlock Text = "{Binding Desc}" ></ TextBlock >
//    </ StackPanel >
//    < StackPanel x:Name="ChildrenSP" Orientation="Vertical"></StackPanel>
//</Grid>

}

Upvotes: 0

Views: 120

Answers (0)

Related Questions