如何在MVVMCROSS中将视图模型绑定到用户控件?

如何在MVVMCROSS中将视图模型绑定到用户控件?,mvvm,windows-8,windows-runtime,windows-store-apps,mvvmcross,Mvvm,Windows 8,Windows Runtime,Windows Store Apps,Mvvmcross,我正在使用优秀的Mvvmcross和用于Mvvmcross的忍者编码器来构建一个跨平台应用程序。对于我的windows应用商店应用程序,我使用Ninja coder创建了一个视图和一个视图模型。我还创建了一个UserControl,它将在视图中引用。因此,我还需要将相同的viewmodel绑定到用户控件。我一直在尝试将用户控件的数据上下文设置为viewmodel的singleton实例。我已经设置了用户控件的数据上下文,如下所示 public sealed partial class Searc

我正在使用优秀的Mvvmcross和用于Mvvmcross的忍者编码器来构建一个跨平台应用程序。对于我的windows应用商店应用程序,我使用Ninja coder创建了一个视图和一个视图模型。我还创建了一个UserControl,它将在视图中引用。因此,我还需要将相同的viewmodel绑定到用户控件。我一直在尝试将用户控件的数据上下文设置为viewmodel的singleton实例。我已经设置了用户控件的数据上下文,如下所示

public sealed partial class SearchResultsGridViewControl : UserControl
{
    private SearchresultsViewModel _viewModel;

    public SearchResultsGridViewControl()
    {
        this.InitializeComponent();

        _viewModel = Mvx.IocConstruct<SearchresultsViewModel>();

        this.DataContext = _viewModel;
    }
}
公共密封部分类SearchResultsGridViewControl:UserControl
{
私有SearchresultsViewModel\u viewModel;
公共搜索结果GridViewControl()
{
this.InitializeComponent();
_viewModel=Mvx.IocConstruct();
this.DataContext=\u viewModel;
}
}
但当我在主视图中引用此用户控件时,它在XAML中抛出一个错误,称“对象引用未设置为对象的实例。无法创建SearchResultsGridViewControl的实例”

这是我的viewmodel:

    public class SearchresultsViewModel : BaseViewModel
{
    private ISearchResultsService _searchResultsService;

    public SearchresultsViewModel(ISearchResultsService searchResultsService)
    {
        _searchResultsService = searchResultsService;
        var items = _searchResultsService.DisplaySearchResults();
        SchoolDetails = new ObservableCollection<School>(items);            
    }

    private ObservableCollection<School> _schoolDetails;

    public ObservableCollection<School> SchoolDetails
    {
        get { return _schoolDetails; }
        set
        {
            _schoolDetails = value;
            RaisePropertyChanged(() => SchoolDetails);
        }
    }

    public ICommand RefineCommand
    {
        get
        {
            refineCommand = refineCommand ?? new MvxCommand(FilterSearchResultsBasedOnRefine);
            return refineCommand;
        }
    }

    public void FilterSearchResultsBasedOnRefine()
    {           
        SchoolDetails = new ObservableCollection<School>(_searchResultsService.FilterSchoolsBasedOnRefine(MidDayMeals, PlayGround, DigitalClassroom, DayBoarding, TransportationFacility));
    }
}
公共类SearchresultsViewModel:BaseViewModel
{
私有ISearchResultsService_searchResultsService;
公共SearchresultsViewModel(ISearchResultsService searchResultsService)
{
_searchResultsService=searchResultsService;
var items=\u searchResultsService.DisplaySearchResults();
学校详细信息=新的可观察集合(项目);
}
私人可观察收集学校详情;
公众可观察收集学校详情
{
获取{return\u schoolDetails;}
设置
{
_学校细节=价值;
RaiseProperty已更改(()=>学校详细信息);
}
}
公共ICommand命令
{
收到
{
refineCommand=refineCommand??新建MvxCommand(FilterSearchResultsBaseDonRefined);
返回命令;
}
}
公共无效筛选器搜索结果BasedonRefine()
{           
SchoolDetails=新的ObservableCollection(_searchResultsService.FilterSchoolBasedOnRefine(午餐、操场、数字教室、日膳、交通设施));
}
}

我的usercontrol中的网格视图在第一次加载时会被填充。但是,当调用RefineCommand从主视图更新集合时,usercontrol中的网格视图不会得到更新。我猜这是因为之前在将用户控件的数据上下文设置为视图模型时出现了错误。请告诉我可能出了什么问题。我已经为此绞尽脑汁好几天了。

我最近一直在Windows应用商店中使用MVVMCross。在不回顾我的代码的情况下,我非常确定Datacontext将从其父级继承,除非被重写

因此,只要您展示的MvxPage有一个viewmodel,您添加到其中的任何用户控件,无论是在XAML中还是在代码隐藏中,都应该共享相同的数据上下文。如果您正在考虑从用户控件执行一些MVVMCross数据绑定,您可能应该确保您的用户控件实现IMvxStoreView,并确保ViewModel属性设置为DataContext的值

希望这能有所帮助

干杯,
Tristan

我最近一直在Windows应用商店中使用MVVMCross。在不回顾我的代码的情况下,我非常确定Datacontext将从其父级继承,除非被重写

因此,只要您展示的MvxPage有一个viewmodel,您添加到其中的任何用户控件,无论是在XAML中还是在代码隐藏中,都应该共享相同的数据上下文。如果您正在考虑从用户控件执行一些MVVMCross数据绑定,您可能应该确保您的用户控件实现IMvxStoreView,并确保ViewModel属性设置为DataContext的值

希望这能有所帮助

干杯,
Tristan

我认为您的第一个问题“对象引用未设置为对象的实例”只是设计时的问题-因为您试图在设计时使用
Mvx设置viewmodel。
。如果需要,可以通过使用设计时视图模型,也可以使用其中一个设计时辅助工具来解决此问题(请参见)



我不知道您的第二个问题是什么“我的usercontrol中的网格视图在第一次加载时会被填充。但是当调用RefineCommand从主视图更新集合时,usercontrol中的网格视图不会被更新”-这听起来像是xaml或从过滤器SearchResultsBasedOnRefine返回的结果中出现的问题。从目前的细节来看,我看不出它是什么。我的“直觉”是,问题不会是Mvvm跨特定的-它只是一个一般的Mvvm/数据绑定问题。

我认为您的第一个问题“对象引用未设置为对象实例”只是设计时的问题-因为您试图在设计时使用
Mvx设置viewmodel。
。如果需要,可以通过使用设计时视图模型,也可以使用其中一个设计时辅助工具来解决此问题(请参见)


我不知道您的第二个问题是什么“我的usercontrol中的网格视图在第一次加载时会被填充。但是当调用RefineCommand从主视图更新集合时,usercontrol中的网格视图不会被更新”-这听起来像是xaml或从过滤器SearchResultsBasedOnRefine返回的结果中出现的问题。从目前的细节来看,我看不出它是什么。我的“直觉”是,问题不会是Mvvm跨特定的-它只是一个一般的Mvvm/数据绑定问题