我正在用Prism构建Xamarin.Forms应用程序,它显示了已连接的蓝牙设备。
在此应用程序中,我需要在所有显示设备连接状态的页面中添加页脚。
为此,我制作了一个名为Pen
的静态类,其属性IsConnected
已从BleService
更新。
我还需要在页脚中有一个按钮,当断开Pen
并单击该按钮时,该按钮可见,我可以调用BleService
的Connect方法。
对于页脚,我在包含按钮的ControlTemplate
中创建了App.xaml
。
现在,我正在使用Prism,并且我不知道如何将按钮绑定到ViewModel(App.xaml
没有ViewModel)以便调用BleService
的Connect Command
答案 0 :(得分:0)
App.xaml
和App.aml.cs
文件包含配置Prism应用程序并在启动时导航到根页面所需的逻辑。
因此您不能为此创建一个ViewModel,因为它不是View,这会破坏MVVM模式。 Prism是MVVM框架,通过通过导航服务加载视图(及其视图模型)来工作。因此,这种用于“全局”视图的方法不适用于绑定。
创建control template也不能解决此问题,它只允许您在app.xaml
中定义可重复使用的模板。
我建议要么:
OR
另一个选择是创建一些自定义渲染。您可以在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();
}
您如何看待? 非常感谢,祝您有美好的一天, 安德里亚