Home > Back-end >  how to refer to item in an enumeration within a ListView
how to refer to item in an enumeration within a ListView

Time:02-21

I have a class MRU which contains an ObservableCollection of type string. I would like to display the items within the collection on a PopupPage in a ListView.

[DefaultBindingProperty("Items")] 
public class MRU<T> :INotifyPropertyChanged
{
    public ObservableCollection<T> Items { get; } = new ObservableCollection<T>();

    // This is the maximum number of items that will be saved to persistent storage, 
    // in use the list can grow beyond this number
    private int _MaxItems = 5;
    public int MaxItems
    {
        get { return _MaxItems; }
        set { 
            _MaxItems = value;
            TrimItems();
            OnPropertyChanged(); 
        }
    }
    public void Add(T t) {
        int idx = Items.IndexOf(t);
        if (idx > 0)
        {
            Items.Move(idx, 0);
        }
        else if (idx == -1)
        {
            Items.Insert(0, t);
        }
    }
    
    public T Pop(int i)
    {
        if (i > 0 && i < Items.Count)
        {
            Items.Move(i, 0);
        }
        return Items[0];
    }

    private void TrimItems()
    {
        while (Items.Count > _MaxItems)
        {
            Items.RemoveAt(Items.Count - 1);
        }

    }
    public void Save()
    {
        App.Current.Properties["MRU"] = SaveToJSON();
        App.Current.SavePropertiesAsync();
    }

    public string SaveToJSON()
    {
        TrimItems();
        string jsonString = JsonSerializer.Serialize(Items);
        return jsonString;
    }
    public int LoadFromJSON(string jsonString)
    {
        Items.Clear();
        ObservableCollection<T> restore = JsonSerializer.Deserialize<ObservableCollection<T>>(jsonString);
        foreach (var t in restore)
        {
            if (Items.Count == _MaxItems) break;
            Items.Add(t);
        }
        return Items.Count;
    }
    protected void OnPropertyChanged([CallerMemberName] string name = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }
    public event PropertyChangedEventHandler PropertyChanged;

}

I can display it in my page using the following XAML

   <StackLayout 
        VerticalOptions="Center" 
        HorizontalOptions="Center" 
        Padding="0,20">
        <Frame BackgroundColor="White" CornerRadius="15">
            <StackLayout>
                <Label Text="Most Recently Used" FontSize="Large" BackgroundColor="LightBlue" HorizontalOptions="CenterAndExpand" Padding="20,4"/>
                <StackLayout >
                    <ListView ItemsSource="{Binding Items}" SelectionMode="Single"> 
                        <!--<ListView.ItemTemplate>
                            <DataTemplate>
                                <StackLayout Orientation="Vertical">
                                    <Label Text="{Binding XXXXXX}"  VerticalOptions="Center" HorizontalTextAlignment="End"  FontSize="Medium"/>
                                </StackLayout>
                            </DataTemplate>
                        </ListView.ItemTemplate> -->
                    </ListView>
                </StackLayout>
             </StackLayout>
        </Frame>
    </StackLayout>

Note the commented out ListView.ItemTemplate section. I would like to display the items within an ItemTemplate so that I can add buttons for each object, however I don't know how to declare it . What should XXXXX be? I've tried a zillion unlikely things

CodePudding user response:

If you have an ObservableCollection<string>, to access the string in your binding, you want to do:

Text="{Binding}"

or

Text="{Binding .}"

Both say that you want to bind to whole object. Since the "whole object" in this case is a string, that's what you'll get.

CodePudding user response:

In your xaml page, you created a ListView. I found that you forgot to add <ViewCell></ViewCell> tags.

You should use a structure like the following:

<ListView  x:Name="listView">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                    
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
  • Related