Xamarin.Forms Prism App.xaml可以绑定到ViewModel吗?

时间:2019-05-28 15:01:37

标签: xamarin xamarin.forms prism

我正在用Prism构建Xamarin.Forms应用程序,它显示了已连接的蓝牙设备。

在此应用程序中,我需要在所有显示设备连接状态的页面中添加页脚。 为此,我制作了一个名为Pen的静态类,其属性IsConnected已从BleService更新。

我还需要在页脚中有一个按钮,当断开Pen并单击该按钮时,该按钮可见,我可以调用BleService的Connect方法。

对于页脚,我在包含按钮的ControlTemplate中创建了App.xaml

现在,我正在使用Prism,并且我不知道如何将按钮绑定到ViewModel(App.xaml没有ViewModel)以便调用BleService的Connect Command

2 个答案:

答案 0 :(得分:0)

  

App.xamlApp.aml.cs文件包含配置Prism应用程序并在启动时导航到根页面所需的逻辑。

From the documentation

因此您不能为此创建一个ViewModel,因为它不是View,这会破坏MVVM模式。 Prism是MVVM框架,通过通过导航服务加载视图(及其视图模型)来工作。因此,这种用于“全局”视图的方法不适用于绑定。

创建control template也不能解决此问题,它只允许您在app.xaml中定义可重复使用的模板。

我建议要么:

  1. 将此页脚添加到所有视图中,这有点麻烦。

OR

  1. 当BleService更改时显示弹出窗口,而不是具有页脚视图。

另一个选择是创建一些自定义渲染。您可以在iOS上添加View to the RootViewController在本地执行此操作。对于其他平台,我不太确定,因此您可以沿着一些自定义渲染器路线尝试使用页脚来获取它,但我认为这不值得头痛。

同样不是理想的解决方案,但是某些平台可以很好地控制它,所以我可以理解为什么Xamarin.Forms没有内置此功能。

答案 1 :(得分:0)

我找到了解决方案,但我想知道您的想法。

在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类,因此任何新的View都将继承指向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();
}

您如何看待? 非常感谢,祝您有美好的一天, 安德里亚