2016-12-08 8 views
0

Ich versuche, nach dem Tippen auf Alarm anzuzeigen, oder klicken Sie auf die ausgewählte ListView Box. Derzeit ist die selectedItem an SelectedTicket gebunden, die innerhalb des ViewModel einen Objektaufruf SelectedTicket auslösen. Sobald der SelectedTicket ausgelöst wird, führt es dann eine popup.show() Methode mit der DisplayAlert() Methode aus. Die Methode DisplayAlert() wird ausgeführt, zeigt jedoch nicht die AlertBox an.Alarmbox erscheint nicht in Xamarin Forms, DisplayAlert()

Image

========================================= =====

//// Xaml Seite

<ListView ItemsSource="{Binding TicketList,Mode=OneWay}" RowHeight="130" 
    ItemTemplate="{StaticResource TicketListTileTemplate}" BackgroundColor="#d9deeb" 
    SelectedItem="{Binding SelectedTicket, Mode=TwoWay}" SeparatorVisibility="None"> 
</ListView> 

============================ ======================

//// ViewModal

public object SelectedTicket 
{ 
    get 
    { 
     return _SelectedTicket; 
    } 
    set 
    { 
     if (SetProperty(ref _SelectedTicket, value)) 
     { 
      if ((value != null) && (value is TicketListItem)) 
      { 
       popup1.Show(); 
       SelectedTicket = null; 
      } 
     } 
    } 
} 

=============================================== =======

////Popup.cs

async public void Show() 
{ 
    DisplayAlert("Alert", "Your have been alerted", "OK"); 
} 

Antwort

1

DisplayAlert() nur Page Objekte verfügbar ist (wie ContentPage oder NavigationPage) sehen here, Ihre Popup.cs vielleicht nicht sein, Page Objekt. Sie erwarten auch nicht DisplayAlert, die Sie immer mit asynchronen Methoden tun möchten. Schließlich wird Ihre Show()-Methode möglicherweise nicht auf dem UI-Thread ausgeführt.

Anstatt zu versuchen, die Warnung von Ihrem Ansichtsmodell zu zeigen, warum Sie nicht versuchen, die Warnung aus dem Code-behind Ihrer XAML Seite wie diese Anzeige:

XAML:

<ListView ItemsSource="{Binding TicketList,Mode=OneWay}" 
      RowHeight="130" 
      ItemTemplate="{StaticResource TicketListTileTemplate}" BackgroundColor="#d9deeb" 
      SelectedItem="{Binding SelectedTicket, Mode=TwoWay}" 
      SeparatorVisibility="None" 
      ItemSelected="OnItemTapped"> <!-- Notice ItemTapped here will trigger when an item is tapped, imagine that --> 

In Code-behind:

.... 

private TicketViewModel _viewModel = new TicketViewModel(); 

.... 

public async void OnItemTapped (object o, ItemTappedEventArgs e) { //Notice I added 'async' to the method here, that is so we can 'await' the DisplayAlert below (ALWAYS 'await' the DisplayAlert and ANY other async methods) 
    TicketListItem item = (TicketListItem)o; 

    if (item != null) { 
     await DisplayAlert("Alert", "Your have been alerted", "OK"); //Notice the 'await' here 
     _viewModel.SelectedTicket = null; 
    } 
} 
3

einer der häufigsten Gründe, warum ich nicht ein DisplayAlert zu sehen ist, weil es auf einer Seite aufgerufen wird, die nicht aktiv auf dem Bildschirm ist.

Als schnelle Abhilfe/test Sie

await Application.Current.MainPage.DisplayAlert("Alert", "Your have been alerted", "OK"); 

tun Wenn dies funktioniert, ist meine erste Annahme bestätigt.

Ich versuche immer, meinen Code sauber zu halten, daher ist der Aufruf vom ViewModel sicherlich ein guter Ansatz. Normalerweise verfügt Ihre MVVM-Bibliothek über einen Code, der Ihnen bei der Anzeige von Warnungen hilft.