Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 尝试首先使用嵌套视图和嵌套视图模型创建MVVM ViewModel_Wpf_Mvvm_View Model Pattern - Fatal编程技术网

Wpf 尝试首先使用嵌套视图和嵌套视图模型创建MVVM ViewModel

Wpf 尝试首先使用嵌套视图和嵌套视图模型创建MVVM ViewModel,wpf,mvvm,view-model-pattern,Wpf,Mvvm,View Model Pattern,我不熟悉使用MVVM,我正在尝试找到一种相当优雅的方法,在创建嵌套视图界面时使用ViewModel First策略。我曾尝试过一个可行的解决方案,但我无法想象这是一个应对这一挑战的理想方式。我在任何论坛上都没有找到解决方案。我包含了一些有限的函数伪类和代码来演示我的工作思想。任何帮助都将不胜感激 using System.Collections.Generic; using System.Collections.ObjectModel; using System.Windows.Controls

我不熟悉使用MVVM,我正在尝试找到一种相当优雅的方法,在创建嵌套视图界面时使用ViewModel First策略。我曾尝试过一个可行的解决方案,但我无法想象这是一个应对这一挑战的理想方式。我在任何论坛上都没有找到解决方案。我包含了一些有限的函数伪类和代码来演示我的工作思想。任何帮助都将不胜感激

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>
使用System.Collections.Generic;
使用System.Collections.ObjectModel;
使用System.Windows.Controls;
公共类BogusStart
{
公共静态课程GetLesson(int id)
{
//实体和子实体将从存储库中调用
//返回LessonRepository.Get(id)
//.包括(“活动”)
//.Include(“活动.子活动”)
//.FirstorDefault();
//假回波
返回新课程();
}
公共用户控件BuildLessonAndChildViews()
{
var_LessonViewModel=LessonViewModel.ViewModelFactory(GetLesson(1));
var_LessonView=新的LessonView();
foreach(ActivityViewModel _LessonViewModel.ActivityViewModels中的ActivityViewModel)
{
var_ActivityView=new ActivityView();
_ActivityView.DataContext=\u ActivityViewModel;
foreach(子活动视图模型中的子活动视图模型。子活动视图模型)
{
var_SubActivityView=新的SubActivityView();
_SubActivityView.DataContext=_SubActivityView模型;
_ActivityView.ChildrenSP.Children.Add(_SubActivityView);
}
_LessonView.ChildrenSP.Children.Add(_ActivityView);
}
return_LessonView;
}
}
公共课
{
公共int id{get;set;}
公共字符串标题{get;set;}
公共字符串Desc{get;set;}
公共ICollection活动{get;set;}
}
公共课堂活动
{
公共int id{get;set;}
公共字符串标题{get;set;}
公共字符串Desc{get;set;}
public int ScoreWeight{get;set;}
公共ICollection子活动{get;set;}
}
公共类子活动
{
公共int id{get;set;}
公共字符串标题{get;set;}
公共字符串Desc{get;set;}
public int ScoreWeight{get;set;}
}
公共课LessonViewModel
{
公共课程_课程{get;set;}
公共ObservableCollection活动视图模型{get;set;}
公共课ViewModel(第一课)
{
_课=_课;
foreach(活动中的活动。活动)
{
添加(ActivityViewModel.ViewModelFactory(此,_活动));
}
}
公共静态课程ViewModel ViewModelFactory(课程)
{
返回新的LessonViewModel(\u课程);
}
}
公共类活动视图模型
{
公共活动_活动{get;set;}
公共LessonViewModel_LessonViewModel{get;set;}
公共ObservableCollection子活动视图模型{get;set;}
公共活动视图模型(LessonViewModel\u LessonViewModel,Activity\u Activity)
{
_活动=_活动;
_LessonViewModel=_LessonViewModel;
foreach(子活动中的子活动。子活动)
{
添加(SubActivityViewModel.viewmodel.ViewModelFactory(this,_subActivity));
}
}
公共静态活动ViewModel ViewModelFactory(LessonViewModel\u LessonViewModel,Activity\u活动)
{
返回新的ActivityViewModel(_lessonViewModel,_Activity);
}
}
公共类子活动视图模型
{
公共子活动_子活动{get;set;}
公共活动视图模型_活动视图模型{get;set;}
公共子活动视图模型(活动视图模型_活动视图模型,子活动_子活动)
{
_ActivityViewModel=\u ActivityViewModel;
_亚活性=_亚活性;
}
公共静态子活动视图模型ViewModelFactory(活动视图模型_活动视图模型,子活动_子活动)
{
返回新的SubActivityViewModel(_activityViewModel,_subActivity);
}
}
///每个视图控件的简单格式示例
/// 
//    
//        
//
//        
//    
//
//

}

即使您正在使用ViewModel first方法,也不应直接使用
UserControl
Widnow
的子控件。您可以以这样的方式创建视图布局:
DataContext
应自动级联到子控件。我理解您的意思,并同意您的看法。这就是我被困的地方。我还没有找到一个如何构造xaml来使用嵌套ViewModels实现这一点的示例。你能给我举个例子吗?让我来搜索一个例子。但是,您的层次结构是正确的,因为
LessonViewModel
包装了
ActivityViewModel
,它包装了
SubActivityViewModel
。因此,如果您将UserControl的DataContext发送到
LessonViewModel
,则其他子控件(包括面板)将具有相同的DataContext。现在,根据您的需求,您可以将ChildViewModel从DataContext级联到Panel或ItemsContrro。