【问题标题】:How to bind view model to a UserControl in MVVMCROSS?如何将视图模型绑定到 MVVMCROSS 中的 UserControl?
【发布时间】:2014-03-04 14:59:49
【问题描述】:

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

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

    public SearchResultsGridViewControl()
    {
        this.InitializeComponent();

        _viewModel = Mvx.IocConstruct<SearchresultsViewModel>();

        this.DataContext = _viewModel;
    }
}

但是当我在主视图中引用此用户控件时,它会在 XAML 中引发错误,提示“对象引用未设置为对象的实例。无法创建 SearchResultsGridViewControl 的实例”。

这是我的视图模型:

    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));
    }
}

第一次加载时,我的用户控件中的网格视图会被填充。但是,当调用 RefineCommand 从主视图更新集合时,用户控件中的网格视图没有得到更新。我猜是因为之前在将用户控件的数据上下文设置为视图模型时出现的错误。请让我知道可能出了什么问题。这几天我一直在苦苦思索。

【问题讨论】:

    标签: mvvm windows-8 windows-runtime windows-store-apps mvvmcross


    【解决方案1】:

    我最近一直在使用 MVVMCross 和 Windows 应用商店。不回头看我的代码,我很确定 Datacontext 将从它的父级继承,除非被覆盖。

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

    希望有所帮助。

    干杯, 特里斯坦

    【讨论】:

      【解决方案2】:

      我认为您的第一个问题“对象引用未设置为对象的实例”只是设计时的问题 - 因为您试图在设计时使用 Mvx. 设置视图模型。如果您想通过使用设计时视图模型以及可能还使用设计时助手之一(请参阅https://github.com/MvvmCross/MvvmCross/blob/v3.1/CrossCore/Cirrious.CrossCore.Wpf/Platform/MvxDesignTimeHelper.cs)来解决此问题。


      我不知道你的第二个问题是“我的用户控件中的网格视图在第一次加载时被填充。但是当调用 RefineCommand 从主视图更新集合时,用户控件中的网格视图没有更新” - 这听起来像是您的 xaml 或从 FilterSearchResultsBasedOnRefine 返回的结果中的问题。从目前的详细程度来看,我看不出它是什么。我的“直觉”是这个问题不会是 MvvmCross 特有的——它只是一个一般的 Mvvm/数据绑定问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多