2016-11-04 2 views
1

Я создание Xamarin FOMS приложение, где я буду иметь сообщения приходят в течение долгого времени, и я всегда хочу новые сообщения, чтобы показать на кнопку моего ListView, как они приходят в.Xamarin формы выделите Buttom

В в тот момент, моя страница выглядит следующим образом:

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

Я не могу понять, как прокручивать из моего класса ViewModel, какие-либо идеи о том, как достичь этого?

Самое лучшее, что мне удалось найти до сих пор, это: http://www.infinite-x.net/2014/10/30/using-the-xamarin-forms-1-3-0-listview-scrollto-method/

Но он даже не думал об использовании MVVM на данном этапе.

+0

Вы пытаетесь перейти к одной из 'Button's? Обе кнопки, которые у вас есть в вашем коде, находятся за пределами «ListView», поэтому они не смогут прокручиваться. – hvaughan3

+0

У моих кнопок есть команда, привязанная к другому классу, из этого класса я добавляю новые сообщения в мое представление. После добавления сообщения я хочу прокрутить представление так, чтобы было видно полное сообщение (а не количество сообщений, которые я добавляю в прокрутку) –

+0

Вы имеете в виду прокрутку к _button_ или _bottom_? –

ответ

2

Ну один, менее элегантно, я знал бы, чтобы решить, что бы разоблачить Action<Message> от вашей ViewModel, а затем ваш ContentPage бы инициализировать эту Action и сказать ему, чтобы сделать прокрутку. Что-то вроде следующего (просто замените Message тем, что когда-либо было настоящим именем модели).

ContentPage:

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); 
     } 
    } 
} 

ViewModel:

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

Я закончил тем, что использовал то, что вы рекомендовали, спасибо! –

+0

@BenjaminKarlog Рад, что это помогло. – hvaughan3

Смежные вопросы