如何使用 xamarin 在列表视图上保存所有字符串

问题描述

我想每次点击“收藏夹”按钮时保存字符串并显示在另一个页面的列表视图上。

从我的第一页开始,我从带有以下代码的按钮中获取字符串

void OnGetFavorites(System.Object sender,System.EventArgs e)
    {
        Preferences.Set("cityName",_cityEntry.Text);
        var tabbedPage = this.Parent.Parent as TabbedPage;
        tabbedPage.CurrentPage = tabbedPage.Children[2];
    }

从我的第二页开始,我使用以下代码页面显示字符串:

 protected override void OnAppearing()
    {
        base.OnAppearing();
        FavoriteCities();
    }

    private void FavoriteCities()
    {
        string cityName = Preferences.Get("cityName","default_value");

        var listView = new ListView();

        listView.ItemsSource = new[] { cityName };

        // Using ItemTapped
        listView.ItemTapped += async (sender,e) => {
            await displayAlert("Tapped",e.Item + " row was tapped","OK");
            Debug.WriteLine("Tapped: " + e.Item);
            ((ListView)sender).SelectedItem = null; // de-select the row
        };

        // If using ItemSelected
        //          listView.ItemSelected += (sender,e) => {
        //              if (e.SelectedItem == null) return;
        //              Debug.WriteLine("Selected: " + e.SelectedItem);
        //              ((ListView)sender).SelectedItem = null; // de-select the row
        //          };

        Padding = new Thickness(0,20,0);
        Content = listView;
    }

    void OnItemTapped(System.Object sender,Xamarin.Forms.ItemTappedEventArgs e)
    {
    }

我的 ListView 看起来像:

 <ContentPage.Content>
    <ScrollView>
        <StackLayout Padding="0,30,0">

            <ListView x:Name="listView"
                      ItemTapped="OnItemTapped"
                      ItemsSource="{Binding .}" />
        </StackLayout>
    </ScrollView>
</ContentPage.Content>

现在每次用新的替换旧的字符串。如何排列所有字符串?

解决方法

有很多不同的方法来解决这个问题。我会给你一个相当简单的

首先,你需要一个数据结构来保存你的数据

ObservableCollection<string> CityData { get; set; }

然后您需要更新您的 XAML 以绑定到它

... ItemsSource="{Binding CityData}" />

然后在页面构造函数中初始化CityData并设置BindingContext

CityData = new ObservableCollection<string>();
this.BindingContext = this;

重要去掉 FavoriteCities 那里没有任何用处,出于某种原因,您正在完全重新创建您的 XAML 中已有的 UI 代码

然后在你的页面中添加一个公共方法来更新数据

public void AddCity(string city)
{
   CityData.Add(city);
}

最后,在你的另一个页面

void OnGetFavorites(System.Object sender,System.EventArgs e)
{
    // I really don't know what this is for
    Preferences.Set("cityName",_cityEntry.Text);

    var tabbedPage = this.Parent.Parent as TabbedPage;

    // important - cast to the correct type of Page2 - I don't know what that is
    var page = (MyPageClass) tabbedPage.Children[2];

    // add the new City
    page.AddCity(cityEntry.Text);

    // navigate
    tabbedPage.CurrentPage = page;
}