2016-05-23 22 views
2

私はXamarin.Formsでアプリケーションを開発しています。ユーザーはフィードの更新を公開でき、このフィードの更新にはテキストと添付されたファイル。私のxamlビューは、基本的にStackLayoutにはListViewEditor、そして、Buttonsという2つが含まれています。問題は、onAppearingメソッドでListViewItemSourceを設定しようとしていることです。メソッドはちょうどいいと呼ばれています。私が設定しているコレクションは期待どおりに変更されます。しかし何らかの理由でListViewが更新されていません。 ListViewの作業を回避するには、SourceEditorフォーカスメソッドを設定した直後でした。コレクションが無条件に設定された後にエディタをクリックしたときに、ListViewが適切にレンダリングされていることがわかったので、私はそのようにしました。しかし、非常に厄介な回避策です。Xamarin.Forms - OnAppearingメソッドでListViewが更新されていません

  • Horizo​​ntalOptionsとVerticalOptionsからの変更:

    public partial class UpdateFeedPage : ContentPage 
        { 
         public static List<FileObject> CurrentSelectedFile = new List<FileObject>(); 
         public static string PostText = ""; 
    
         public UpdateFeedPage() 
         { 
          InitializeComponent(); 
          Title = "New Update"; 
          UpdateFeedEditor.Text = PostText; 
         } 
    
         protected override void OnAppearing() 
         { 
          AttachedFilesListView.ItemsSource = CurrentSelectedFile; 
          UpdateFeedEditor.Focus(); 
          base.OnAppearing(); 
         } 
    
         async void onPostClicked(object sender, EventArgs e) 
         { 
          await Navigation.PopAsync(); 
         } 
    
         async void onAttachFileClicked(object sender, EventArgs e) 
         { 
          await Navigation.PushAsync(new FilePickerPage()); 
         } 
        } 
    

    は、私のようなものがたくさんで再生:

    <?xml version="1.0" encoding="utf-8" ?> 
    <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
          xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
          x:Class="HalliganTL.View.UpdateFeedPage"> 
        <StackLayout Orientation="Vertical" > 
        <ListView x:Name="AttachedFilesListView" MinimumHeightRequest="50" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" > 
         <ListView.ItemTemplate> 
         <DataTemplate> 
          <ViewCell> 
          <StackLayout HorizontalOptions="StartAndExpand" Orientation="Horizontal"> 
           <Button Text="[X]" /> 
           <StackLayout Padding="5,0,0,0" VerticalOptions="StartAndExpand" Orientation="Vertical"> 
           <Label Text="{Binding Name}" VerticalTextAlignment="Center" FontSize="Medium" /> 
           </StackLayout> 
          </StackLayout> 
          </ViewCell> 
         </DataTemplate> 
         </ListView.ItemTemplate> 
        </ListView> 
        <Editor x:Name="UpdateFeedEditor" FontSize="15" Text="{Binding PostText}" VerticalOptions="FillAndExpand" /> 
        <Button Text="Attach file" TextColor="White" BackgroundColor="#77D065" Clicked="onAttachFileClicked"/> 
        <Button Text="Post" TextColor="White" BackgroundColor="#77D065" Clicked="onPostClicked"/> 
        </StackLayout> 
    </ContentPage> 
    

    はここに私のページのコードです:ここで

    は私のXAMLですListViewとListViewを含むStackLayoutを返します。

  • StackLayoutと子ListView以外のコントロールはすべて削除されました。

しかし、何も、エディタを呼び出すことを除いて、これまで働いていないフォーカス方式をプログラム

注:

あなたは私が設定していたListViewコレクションは静的で見ることができるように、私は変更私がOnAppearingでブレークポイントを設定すると、コレクションが適切に変更されていたので、これは問題ありません。

+0

「ListViewが更新されていない」と言うと、すでに 'UpdateFeedPage'を見て、別のページに行き戻りましたか?あるいは、 'UpdateFeedPage'を見ているのは初めてです。 – SushiHangover

+0

私は既にUpdateFeedPageを見たことがあります。 – 4gus71n

答えて

5

リフレッシュの問題を解決する2つの方法です。

第一の方法)

フォースItemsSourceをリセットすることで、あなたのList<FileObject>コレクションからリフレッシュするリストビュー:

電流:

protected override void OnAppearing() 
{ 
    AttachedFilesListView.ItemsSource = CurrentSelectedFile; 
    UpdateFeedEditor.Focus(); 
    base.OnAppearing(); 
} 

に変更:

protected override void OnAppearing() 
{ 
    base.OnAppearing(); 
    AttachedFilesListView.ItemsSource = null; 
    AttachedFilesListView.ItemsSource = CurrentSelectedFile; 
} 

第二の方法)の変更がListViewがlistenされますNotifyCollectionChangedAction.Add|Remove|...基づいてイベントを経て公開されているので、

ObservableCollection<FileObject>であなたのList<FileObject>コレクションを交換してください。

電流:

public static List<FileObject> CurrentSelectedFile = new List<FileObject>(); 

変更するには:

public static readonly ObservableCollection<FileObject> CurrentSelectedFile = new ObservableCollection<FileObject>(); 

注:またusing System.Collections.ObjectModel;

あなたOnAppearingになる追加:

protected override void OnAppearing() 
{ 
    base.OnAppearing(); 
    AttachedFilesListView.ItemsSource = CurrentSelectedFile; 
} 
+0

INotifyPropertyChangedは、与え続けている贈り物です。 –

+0

すごい!両方のソリューションが完璧に動作したが、私は明らかに2番目のソリューションを選択した。 – 4gus71n

+0

@ 4gus71n喜んで...幸せなXammieコーディング.... – SushiHangover

関連する問題