构造函数,视图模型(Constructor in ViewModel)

2019-06-24 06:50发布

是否有可能在视图模型构造,至极初始化数据服务吗? (不要误会我的意思,我的数据服务访问数据存储的网络服务)是这样的(因为问我得到的ViewLoader抛出的异常“无法加载视图模型......”它不显示整个异常...):

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Collections.ObjectModel;
    using Cirrious.MvvmCross.ViewModels;
    using Cirrious.MvvmCross.Commands;
    using MobSales.Logic.DataService;
    using MobSales.Logic.Base;
    using MobSales.Logic.Model;

    namespace MobSales.Logic.ViewModels
    {
        public class CustomersViewModel:MvxViewModel
        {
            ICustomerService custService;
        public CustomersViewModel(ICustomerService custService)
        {
            this.custService = custService;
            if (custService != null)
            {
                custService.LoadCustomerCompleted += new EventHandler<CustomerLoadedEventArgs>(custService_LoadCustomerCompleted);
            }
            loadCustomerCommand = new MvxRelayCommand(LoadCustomer);
            loadCustomerCommand.Execute();
        }


    private ObservableCollection<Customer> customers;

    public ObservableCollection<Customer> Customers
    {
        get { return customers; }
        set
        {
            customers = value;
            FirePropertyChanged("Customers");
        }
    }


    private CustomerViewModel customer;

    public CustomerViewModel Customer
    {
        get { return customer; }
        set
        {
            customer = value;
            FirePropertyChanged("Customer");
        }
    }


    private MvxRelayCommand loadCustomerCommand;

    public MvxRelayCommand LoadCustomerCommand
    {
        get { return loadCustomerCommand; }
    }

    public void LoadCustomer()
    {
        custService.LoadCustomer();
    }

    void custService_LoadCustomerCompleted(object sender, CustomerLoadedEventArgs e)
    {
        if (e.Error != null)
        {
            return;
        }

        List<Customer> loadedCustomers = new List<Customer>();
        foreach (var cust in e.Customers)
        {
            loadedCustomers.Add(new Customer(cust));
        }

        Customers = new ObservableCollection<Customer>(loadedCustomers);
    }

}

完整的例外是:Cirrious.MvvmCross.Exceptions.MvxException:无法加载视图模型从定位MvxDefau型MobSales.Logic.ViewModels.CustomersViewModel ...

该从View到ViewModel的绑定实现像我张贴在这个岗位: MVVMCross绑定Android中

谢谢!

Answer 1:

之一的MvvmCross的异常(自以为是)特征在于,在默认情况下,它使用视图模型构造器参数作为导航机制的一部分。

这是通过一个例子,我的回答解释从视图模型变量传递到另一个View(MVVMCross)

其基本思想是,当一个HomeViewModel请求使用导航:

private void DoSearch()
{
    RequestNavigate<TwitterViewModel>(new { searchTerm = SearchText });
}

然后这将导致一个TwitterViewModel与传递到构造的SEARCHTERM来构造:

public TwitterViewModel(string searchTerm)
{
    StartSearch(searchTerm);
}

目前,这意味着每个视图模型必须具有或者没有参数或只有字符串参数的公共构造函数

因此,您的视图模型不加载原因是因为MvxDefaultViewModelLocator找不到您的视图模型一个合适的构造函数。


为“服务”,则MvvmCross框架确实提供了其中可以使用最容易访问的简单的IOC容器GetService<IServiceType>()扩展方法。 例如,在微样品视图模型中的一个包含:

public class TwitterViewModel
    : MvxViewModel
    , IMvxServiceConsumer<ITwitterSearchProvider>
{
    public TwitterViewModel(string searchTerm)
    {
        StartSearch(searchTerm);
    }

    private ITwitterSearchProvider TwitterSearchProvider
    {
        get { return this.GetService<ITwitterSearchProvider>(); }
    }

    private void StartSearch(string searchTerm)
    {
        if (IsSearching)
            return;

        IsSearching = true;
        TwitterSearchProvider.StartAsyncSearch(searchTerm, Success, Error);
    }

    // ...
}

同样,你可以看到会议服务的数据是如何在消耗会议BaseViewModel


如果您希望使用其他一些IoC容器或其他一些机制建设为您的ViewModels,那么你就可以覆盖内MvvmCross视图模型建设。

就拿如何做到这一点的想法来看看这个问题(和答案) - 如何更换MvxDefaultViewModelLocator在MVVMCross应用

例如,如果你想的话,那应该是相当容易为你调整MyViewModelLocator在这个问题例如与您的服务来构建你的视图模型。



文章来源: Constructor in ViewModel