2016-11-04 77 views
1

我創作的Xamarin FOM的應用,在那裏我將有消息隨着時間快到了,我總是希望新的消息顯示在我的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之一?您在代碼中使用的兩個Button都不在ListView中,因此它們無法滾動到。 – hvaughan3

+0

我的按鈕有綁定到另一個類的命令,從那個類我添加新消息到我的視圖。 使整個消息可見(不母校多少,我添加滾動視圖消息) –

+0

你的意思是滾動到_button_或_bottom_加入我要滾動視圖的消息後? –

回答

2

好了一個,少於優雅的方式,我想知道解決,這將是暴露您的ViewModel的Action<Message>,然後你會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); 
     } 
    } 
} 

視圖模型:

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