2016-11-04 9 views
1

Ich bin Schöpfung ein Xamarin Fomulare app, wo ich Nachrichten über die Zeit kommen wird, und ich will immer die neuen Nachrichten auf den Button meiner Listview zeigen, wie sie in kommen.Xamarin Formen blättern Buttom

Bei der Moment, meine Seite sieht wie folgt aus:

<StackLayout> 
    <Button Text="Login" /> 
    <ListView x:Name="MessageBox" ItemsSource="{Binding TempTest}" ></ListView> 
    <Button Command="{Binding AddMessage}" Text="Login"/> 
</StackLayout> 

ich kann nicht herausfinden, wie man aus meiner Klasse Ansichtsmodell blättern, keine Ideen, wie dies zu erreichen?

Das Beste, was ich in der Lage gewesen, so weit zu finden sind dies: http://www.infinite-x.net/2014/10/30/using-the-xamarin-forms-1-3-0-listview-scrollto-method/

Aber er ist nicht einmal darüber nachzudenken, MVVM zu diesem Zeitpunkt verwendet wird.

+0

Sind Sie versuchen, zu einem der 'Button's blättern? Beide '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' – hvaughan3

+0

Meine Schaltflächen haben einen Befehl, der an eine andere Klasse gebunden ist. Von dieser Klasse aus füge ich neue Nachrichten zu meiner Ansicht hinzu. Nach dem Hinzufügen der Nachricht möchte ich die Ansicht scrollen, so dass die vollständige Nachricht sichtbar ist (nicht wie viele Nachrichten, die ich in der Bildlaufansicht hinzufügen) –

+0

Meinst du scrollen zu _button_ oder _bottom_? –

Antwort

2

Nun, die ein weniger als elegante Art und Weise, würde ich wissen, dass zu lösen wäre ein Action<Message> von Ihrem Viewmodel zu entlarven und Ihrer dann ContentPage würde diese Action initialisieren und sagt, dass es das Scrollen zu tun. Etwas wie das Folgende (ersetzen Sie einfach Message mit dem tatsächlichen Namen des Modells).

Content:

public partial class MessagePage : ContentPage { 

    private MessageViewModel _viewModel; 

    public MessagePage() { 
     _viewModel = new MessageViewModel(); 

     BindingContext = _viewModel; 

     _viewModel.OnMessageAdded = message => { //We tell the action to scroll to the passed in object here 
      MessageBox.ScrollTo(message, ScrollToPosition.MakeVisible, true); 
     } 
    } 
} 

Ansichtsmodell:

public class MessageViewModel { 
    public Action<Message> OnMessageAdded { get; set; } 

    public ICommand AddMessage { get; protected set; } 

    private ObservableCollection<Message> _tempTest; 
    public ObservableCollection<Message> TempTest { 
     get { return _tempTest ?? (_tempTest = new ObservableCollection<Message>()); } 
     set { 
      if(_tempTest != value) { 
       _tempTest = value; 
       OnPropertyChanged(); 
      } 
     } 
    } 

    public MessageViewModel() { 
     AddMessage = new Command(async() => { 
      Message message = SomeClass.GetMessage(); //Get your object from your separate class 

      TempTest.Add(message); //Add it to the list that your ListView binds to 

      OnMessageAdded?.Invoke(message); //Now run the Action which, if it is not null, your ContentPage should have set to do the scrolling 

      //Or if you are not using C#6: 
      //Action<Message> onMessageAdded = OnMessageAdded; 

      //if(onMessageAdded != null) { onMessageAdded.Invoke(message); } 
     }); 
    } 
} 
+1

Ich landete mit etwas, was Sie empfohlen haben, danke! –

+0

@BenjaminKarlog Froh, dass es geholfen hat. – hvaughan3