Reputation: 1
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