如何在Xamarin中从ViewModel创建警报弹出窗口?

时间:2018-10-25 08:40:26

标签: xamarin xamarin.forms alert

我正在使用MVVM模式开发Xamarin应用。我想在用户按下按钮时向用户显示警报。

我用

声明我的ViewModel
class MainPageViewModel : BindableBase   {

不幸的是,我无法直接从ViewModel中访问Page对象。如何最好地显示我的警报?

6 个答案:

答案 0 :(得分:2)

如果您使用的是正常的MVVM模式,则可以在视图模型中调用以下代码。

App.current.MainPage.DisplayAlert("","","");

答案 1 :(得分:2)

要显示Alert,请在ViewModel类中编写以下代码

public class MainViewModel
{
    public ICommand ShowAlertCommand { get; set; }
    public MainViewModel()
    {
        ShowAlertCommand = new Command(get => MakeAlter());
    }
    void MakeAlter()
    {
        Application.Current.MainPage.DisplayAlert("Alert", "Hello", "Cancel", "ok");
    }
}

在xaml中将Command设置为Button

<StackLayout>
<Button Text="Click for alert" Command="{Binding ShowAlertCommand}"
   HorizontalOptions="Center"
   VerticalOptions="CenterAndExpand" />
</StackLayout>

在您的xaml文件后面的代码中设置BindingContext。如果您是xaml文件MainPage.xaml

public MainPage()
{
    InitializeComponent();
    BindingContext = new MainViewModel();

}

答案 2 :(得分:1)

您可以使用Prism的PageDialogService,使您的ViewModel保持干净和可测试性。

答案 3 :(得分:0)

该聚会很晚,但是正如Nick Turner在许多评论中提到的那样,到目前为止给出的解决方案要求视图模型引用该视图,这是MVVM的反模式/侵权。此外,在视图模型单元测试中还会出现错误,例如:您必须调用Xamarin.Forms.Init();。在使用它之前。

相反,您可以创建一个包含警报框代码的界面,然后在视图模型中使用它,如下所示:

接口:

public interface IDialogService
{ 
    Task ShowAlertAsync(string message, string title, string buttonLabel); 
}

实现(使用ACR.UserDialogs NuGet包):

public class DialogService : IDialogService
{
    public async Task ShowAlertAsync(string message, string title, string buttonLabel)
    {
        if (App.IsActive)
            await UserDialogs.Instance.AlertAsync(message, title, buttonLabel);            
        else
        {
            MessagingCenter.Instance.Subscribe<object>(this, MessageKeys.AppIsActive, async (obj) =>
            {
                await UserDialogs.Instance.AlertAsync(message, title, buttonLabel);
                MessagingCenter.Instance.Unsubscribe<object>(this, MessageKeys.AppIsActive);
            });
        }
    }
}

ViewModel:

public class TestViewModel
{    
    private readonly IDialogService _dialogService;

    public TestViewModel(IDialogService dialogService)
    {
         //IoC handles _dialogService implementation
         _dialogService = dialogService ?? throw new ArgumentNullException(nameof(dialogService));
    }

    public ICommand TestCommand => new Command(async () => await TestAsync());

    private async Task TestAsync()
    {
        await _dialogService.ShowAlertAsync("The message alert will show", "The title of the alert", "The label of the button");
    }
}

然后将TestCommand绑定到您的xaml中的按钮上:

<Button x:Name="testButton" Command="{Binding TestCommand}">

答案 4 :(得分:0)

创建这样的弹出窗口是个好主意吗? (从我的 ViewModel 调用)

private void OpenPopUp()
{
    Application.Current.MainPage.Navigation.ShowPopup(new CustomPopUp());
}

您可以在此处找到有关如何创建自定义小狗的指南: https://www.youtube.com/watch?v=DkQbTarAE18

对我来说效果很好,但我对 Xamarin 很陌生。

答案 5 :(得分:0)

对于 Shell 应用程序,我能够像这样实现

await Shell.Current.DisplayAlert("Title", "Message", "Cancel");