Как изменить свойство выбранного элемента в ListView - PullRequest
0 голосов
/ 06 мая 2020

Мне нужно изменить свойство выбранного элемента в ListView (Xamarin Forms).

List<Item> _source = new List<Item>();
_source.Add(new Item { Title = "First item" });

ListView.ItemsSource = _source;

Я пытаюсь изменить свойство элемента, которое я выбрал в списке.

Item item = ListView.SelectedItem as Item;
item.Title = "Changed title";

Подскажите, что делаю не так? Я тоже пытаюсь выбрать элемент по индексу. Поскольку свойство SelectedIndex отсутствует, я попытался сделать это:

int selector = 1;
ListView.SelectedItem = _source[selector];

Но это тоже не сработало.

Помогите мне, пожалуйста. Спасибо.

1 Ответ

0 голосов
/ 07 мая 2020

Как сказал Джейсон, вам необходимо реализовать интерфейс INotifyPropertyChanged для класса Item, если вы хотите сначала изменить свойство Item.

 public class Item:ViewModelBase
{
    private string _Title;
    public string Title
    {
        get { return _Title; }
        set
        {
            _Title = value;
            RaisePropertyChanged("Title");
        }
    }
}

ViewModelBase - это класс, реализующий INotifyPropertyChanged interface.

public class ViewModelBase : INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;


    public void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

Затем я предлагаю вам использовать ObservableCollection для замены List, потому что Observablecollection представляет динамическую c коллекцию данных, которая предоставляет уведомления при добавлении элементов, удален, или когда весь список обновлен.

Наконец, используя привязку для ListView и изменив свойство selecteditem.

<StackLayout>
        <ListView x:Name="listview1" ItemsSource="{Binding source}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <Label Text="{Binding Title}" />
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

        <Button
            x:Name="btn1"
            Clicked="btn1_Clicked"
            Text="update data" />
    </StackLayout>

public partial class Page18 : ContentPage
{
    public ObservableCollection<Item> source { get; set; }
    public Page18()
    {
        InitializeComponent();

        source = new ObservableCollection<Item>()
        {
            new Item(){Title="title 1"},
            new Item(){Title="title 2"},
            new Item(){Title="title 3"},
            new Item(){Title="title 4"},
            new Item(){Title="title 5"}
        };
        this.BindingContext = this;
    }

    private void btn1_Clicked(object sender, EventArgs e)
    {
        Item item = listview1.SelectedItem as Item;
        item.Title = "Changed title";
    }
}

О привязке и INotifyPropertyChanged, пожалуйста, посмотрите:

https://docs.microsoft.com/en-us/xamarin/xamarin-forms/xaml/xaml-basics/data-bindings-to-mvvm

...