Xamarin.Forms Prism App.xaml может быть привязан к ViewModel? - PullRequest
0 голосов
/ 28 мая 2019

Я создаю приложение Xamarin.Forms с Prism, оно показывает, какие устройства Bluetooth подключены.

В этом приложении мне нужен нижний колонтитул на всех страницах, показывающих состояние подключения устройства.Для этого я создал статический класс Pen со свойством IsConnected, обновленным из BleService.

. Мне также нужна кнопка в нижнем колонтитуле, которая отображается, когда Penотключен, и при нажатии я могу вызвать метод Connect для BleService.

Для нижнего колонтитула я сделал ControlTemplate в App.xaml, содержащем кнопку.

Теперь я использую Prism и не знаю, как связать кнопку с ViewModel (App.xaml не имеет ViewModel) для вызова команды Connect BleService.

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

Я нашел решение, но я хотел бы знать, что вы думаете.

В App.Xaml в шаблоне управления я связал команду кнопки подключения, как показано ниже:

<buttons:SfButton Grid.Column="0" Grid.Row="2"
    Command="{TemplateBinding Parent.BindingContext.ConnectCommand}"
    IsVisible="{Binding IsNotConnected, Source={x:Static local:Pen.Current}}"/>

Затем я изменил класс ViewModelBase, поэтому любой новый вид будет наследовать ссылку на службу Bluetooth и выполнение команды:

public class ViewModelBase : BindableBase, INavigationAware, IDestructible
{
    protected INavigationService NavigationService { get; private set; }
    protected IBLEService BLEService { get; private set; }

    private string _title;
    public string Title
    {
        get { return _title; }
        set { SetProperty(ref _title, value); }
}

public ViewModelBase(INavigationService nS,IBLEService bS)
{
    NavigationService = nS;
    BLEService = bS;
}

public virtual void Destroy()
{
}

private DelegateCommand connectCommand;
public DelegateCommand ConnectCommand => connectCommand ?? 
    (connectCommand = new DelegateCommand(ExecuteConnectCommand));

async void ExecuteConnectCommand()
{
    await BLEService.Connect();
}

О чем ты думаешь? Большое спасибо и хорошего дня, Andrea

0 голосов
/ 28 мая 2019

Файлы App.xaml и App.aml.cs содержат логику, необходимую для настройки приложения Prism и перехода к корневой странице при запуске.

Из документации

Таким образом, вы не можете создать для этого ViewModel, так как это не View, и это нарушит шаблон MVVM.Prism - это фреймворк MVVM, который работает путем загрузки представлений (и их моделей представления) через службу навигации.Таким образом, этот подход к «глобальному» представлению не будет работать с привязкой.

Создание шаблона управления также не собирается это исправлять, он просто позволяет использовать повторно используемый шаблонопределено в app.xaml.

. Я бы предложил:

  1. Добавить этот нижний колонтитул во все представления, что немного накладно.

ИЛИ

Показывать всплывающее окно при изменении BleService, а не при отображении нижнего колонтитула.

Другим вариантом будет создание некоторых пользовательских визуализаций.Вы можете сделать это изначально на iOS, добавив View к RootViewController .Что касается других платформ, я не слишком уверен, так что вы могли бы пойти по какой-то специальной дороге рендерера, чтобы попытаться получить его с помощью нижнего колонтитула, но я не думаю, что это стоит головной боли.

Опять не идеальнорешения, но некоторые платформы могут очень хорошо это контролировать, поэтому я понимаю, почему Xamarin.Forms не имеет этого встроенного.

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