Добавление интерфейса API в конструктор ViewModel и навигация перестает работать Prism - PullRequest
0 голосов
/ 30 ноября 2018

Я использую VS 17 для форм Xamarin.Я настроил Prism в своем приложении Xamarin.Forms и просто добавил ссылку на мой интерфейс Api (в конструкторе ViewModel), и он заставляет приложение прекратить переход на вторую страницу.Я должен сделать это для передачи параметров и т. Д. Я следовал этому руководству:

https://blog.qmatteoq.com/prism-for-xamarin-forms-basic-navigation-and-dependency-injection-part-2/

Это то, что я сделал, чтобы навигация перестала работать:

private readonly IService _Service;
private ObservableCollection<TodoItem> _topSeries;

public ObservableCollection<TodoItem> TopSeries
{
    get { return _topSeries; }
    set { SetProperty(ref _topSeries, value); }
}

Это конструктор:

public SecondPageViewModel(IService Service, INavigationService navigationService)   
{
    _Service = Service;
    _navigationService = navigationService;
}

Так что я даже не могу добраться до вышеприведенной модели представления из-за кода, который я добавил.Я пытался поставить точки останова на DelegateCommand (на первой ViewModel), но он просто останавливается после InitializeComponent ();и тогда ничего не происходит.Нет сообщений об ошибках!Спасибо!

Обновление:

Мой класс обслуживания, который извлекает данные:

public class Service : IService
{

    public List<TodoItem> TodoList { get; private set; }
    HttpClient client;

    Service()
    {
        client = new HttpClient();
        client.MaxResponseContentBufferSize = 256000;
    }

    public async Task<List<TodoItem>> DataAsync()
    {

        TodoList = new List<TodoItem>();

        var uri = new Uri(string.Format(Constants.RestUrl, string.Empty));

        try
        {
            var response = await client.GetAsync(uri);
            if (response.IsSuccessStatusCode)
            {
                var content = await response.Content.ReadAsStringAsync();
                TodoList = JsonConvert.DeserializeObject<List<TodoItem>>(content);
                Debug.WriteLine(content);
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine(@"ERROR {0}", ex.Message);
        }

        return TodoList;
    }
}

Это мой App.Xaml.cs

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    containerRegistry.RegisterForNavigation<NavigationPage>();
    containerRegistry.RegisterForNavigation<View.MainPage, MainPageViewModel>();
    containerRegistry.RegisterForNavigation<View.SecondPage, SecondPageViewModel>();
    containerRegistry.Register<IService, Service>();
}

МойИнтерфейс:

public interface IService
{
    Task<List<TodoItem>> DataAsync();
}

Вот как я перемещаюсь (щелкните из списка):

private EventItem _selectedEvent { get; set; }
public EventItem SelectedEvent
{
    get { return _selectedEvent; }  
    set
    {
        if (_selectedEvent != value)
        {
            if (Device.RuntimePlatform == Device.iOS)
            {
                _selectedEvent = null;
            }
            else
            {
                _selectedEvent = value;
            }
            NavigationParameters navParams = new NavigationParameters();
            navParams.Add("PassedValue", _todoItem.name);

            _navigationService.NavigateAsync("SecondPage", navParams);
        }
    }
}

Редактировать:

Когда я отлаживаю без кода ApiService, команда принимаетменя к новому новому конструктору в новой viewmodel.С кодом он не доходит до конструктора.

1 Ответ

0 голосов
/ 30 ноября 2018

Согласно вашему коду вы объявили конструктор так:

Service()
{
    // ...
}

Вы не установили модификатор доступа, поэтому по умолчанию используется internal.Вот определение:

Внутренние типы или элементы доступны только внутри файлов в одной сборке.

Скорее всего, ваш Service.cs объявлен в другой сборке иПризма не может получить доступ к своему конструктору.Ваша навигация не работает, потому что внедрение зависимости не удается.Чтобы это исправить, просто измените свой модификатор доступа на public:

public Service()
{
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...