如何在 ListView 中引用枚举中的项目

how to refer to item in an enumeration within a ListView

我有一个 class MRU,其中包含一个字符串类型的 ObservableCollection。我想在 ListView 的 PopupPage 上显示集合中的项目。

[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;

}

我可以使用以下 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>

注意注释掉的 ListView.ItemTemplate 部分。我想在 ItemTemplate 中显示项目,以便我可以为每个对象添加按钮,但我不知道如何声明它。 XXXXX 应该是什么?我已经尝试了无数不可能的事情

如果您有 ObservableCollection<string>,要访问绑定中的字符串,您需要执行以下操作:

Text="{Binding}"

Text="{Binding .}"

两者都说您想绑定到整个对象。由于本例中的“整个对象”是一个字符串,这就是您将得到的。

在您的 xaml 页面中,您创建了一个 ListView。我发现您忘记添加 <ViewCell></ViewCell> 标签。

您应该使用如下结构:

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