Home > database >  Listview is not updating automatically from observablecollection
Listview is not updating automatically from observablecollection

Time:12-13

I have started programming with .NET MAUI and have a small problem. Anyway, I tried to update my listview automatically when a note is deleted. Deleting the note works so far. The updating not yet, how could I do that?

I tried to solve my problem with the help of various posts in different online forums, but none of these posts helped and so I am creating my own.

My code so far:

XAML:

 <RefreshView
        IsRefreshing="{Binding IsRefreshing}"
        Command="{Binding RefreshCommand}"
        RefreshColor="Black"
        Refreshing="Refresh"
        x:Name="myRefreshView"
        >
    <VerticalStackLayout>
        <ScrollView>
        <StackLayout>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>

                <Image
                    Grid.Column="0"
                    Source="logo.png"
                    WidthRequest="150"
                    HorizontalOptions="Start"
                    VerticalOptions="Start" 
               />

                <Label
                    TextColor="Black"
                    Grid.Column="1"
                    Text="TODO"
                    FontSize="35"
                    HorizontalOptions="Start" 
                    VerticalOptions="Start" 
                    Margin="23" 
                    
                    />

            </Grid>

            <Grid BackgroundColor="#24D4A3">
                    <Grid.RowDefinitions>
                        <RowDefinition />
                        <RowDefinition />
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>

                <ListView 
                Grid.ColumnSpan="2"
                Grid.RowSpan="2"
                RowHeight="100"
                x:Name="listview"
                ItemsSource="{Binding Notes}
                    "
                >
                    <ListView.ItemTemplate>
                        <DataTemplate >
                            <ViewCell >
                                <Grid BackgroundColor="#24D4A3"  
                                 >
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="auto"/>
                                    </Grid.RowDefinitions>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="auto"/>
                                    </Grid.ColumnDefinitions>
                                    <Button BackgroundColor="#DEABF5"
                                        Text="{Binding Title}"
                                        BorderWidth="2"
                                        TextColor="Black"
                                        FontSize="28"
                                        Margin="20"
                                        CornerRadius="100"
                                        WidthRequest="350"
                                        HeightRequest="70"
                                        HorizontalOptions="Center"
                                        VerticalOptions="Start"/>


                                    <Button
                                        BindingContext="{Binding Id}"
                                        Clicked="ToDoSolved" 
                                        BorderWidth="2"
                                        BorderColor="Black"
                                        BackgroundColor="White"
                                        WidthRequest="45"
                                        HeightRequest="45"
                                        CornerRadius="35" 
                                        Margin="0,0,260,0" 
                                        />
                                </Grid>
                            </ViewCell>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>

                <ImageButton  
                            Clicked="Settings"
                            Source="settings.png"
                            Grid.Row="0"
                            Grid.Column="2"
                            BorderColor="#2b3c3c" 
                            BorderWidth="0" 
                            BackgroundColor="#34A4EB" 
                            CornerRadius="35" 
                            HorizontalOptions="End" 
                            WidthRequest="70" 
                            HeightRequest="70" 
                            Margin="0,10, 10, 0" 
                            VerticalOptions="Start"/>
                    <ImageButton 
                            Clicked="CreateNote"
                            Source="add.png"
                            Grid.Row="1"
                            Grid.Column="2"
                            BorderColor="#2b3c3c" 
                            BorderWidth="0" 
                            BackgroundColor="#34A4EB" 
                            CornerRadius="35" 
                            HorizontalOptions="End" 
                            WidthRequest="70" 
                            HeightRequest="70" 
                            Margin="0,0,10,10" />
                </Grid>

        </StackLayout>

    </ScrollView>
    </VerticalStackLayout>
    </RefreshView>

C# MainPage:

public partial class MainPage : ContentPage
    { 

    private List<Note> notes = new List<Note>();
    public List<Note> Notes 
    {
        get { return notes; }
        set { notes = value; }
    }
    public MainPage()   
    {
        InitializeComponent();

        notes.Add(new Note(0, "My Note1", "I'm ugly"));
        notes.Add(new Note(1, "My Note2", "I'm short"));
        notes.Add(new Note(2, "My Note3", "I'm smart"));
        notes.Add(new Note(3, "My Note4", "I'm smart"));
        this.BindingContext= Notes;
        listview.ItemsSource= Notes;
        
    }

    private async void CreateNote(object sender, EventArgs e)
    {
        await Shell.Current.GoToAsync("//CreateNote");
    }

    private async void Settings(object sender, EventArgs e)
    {
        await Shell.Current.GoToAsync("//Settings");
    }

    private void ToDoSolved(object sender, EventArgs e)
    {
        Button button= (Button) sender ;
        
        var id = (int)button.BindingContext;
         
         var item = Notes.SingleOrDefault(x => x.Id == id);
         if (item != null) 
        {
            Notes.Remove(item);
            Console.WriteLine(id);
        }
       
        Refresh(sender, e);

    }

    async void Refresh(object sender, EventArgs e)
    {
        await Task.Delay(1000);
        this.BindingContext = Notes;
        listview.ItemsSource = Notes;
        
        
        myRefreshView.IsRefreshing = false;
    }
}

and my "noteclass":

public class Note
    {
        public ObservableCollection<Note> ob_notes = new ObservableCollection<Note>();

        public ObservableCollection<Note> Notes { get { return ob_notes; } }
        public Note (int id, string title, string body)
        {
            this.Body = body;
            this.Id = id;
            this.Title = title;
        }
        public int Id { get; set; }
        public string Title { get; set; }
        public string Body { get; set; }
    }

CodePudding user response:

You can use the RefreshView like below, I simplify your code and make it neat but to the point. To delete the item, since you are using ListView, you can delete the selected item using ItemSelected method. For more details, you can refer to Respond to item selection.

Code-behind:

public partial class MainPage : ContentPage 
{

    bool isRefreshing;

    public ObservableCollection<Note> Notes { get; private set; } = new ObservableCollection<Note>();

    public ICommand RefreshCommand => new Command(async () => await RefreshItems());

    public bool IsRefreshing
    {
        get { return isRefreshing; }
        set
        {
            isRefreshing = value;
            OnPropertyChanged();
        }
    }

    public MainPage()
    {
        InitializeComponent();

        AddNotes();

        BindingContext = this;
    }

    private void AddNotes()
    {
        Notes.Add(new Note(0, "My Note1"));
        Notes.Add(new Note(1, "My Note2"));
        Notes.Add(new Note(2, "My Note3"));
        Notes.Add(new Note(3, "My Note4"));
    }

    private async Task RefreshItems()
    {
        IsRefreshing = true;

        await Task.Delay(500);

        Notes.Clear();
        AddNotes();
  
        IsRefreshing = false;

    }

}

Xaml:

<RefreshView 

        IsRefreshing="{Binding IsRefreshing}"
        Command="{Binding RefreshCommand}"
        RefreshColor="Black"
        >

        <VerticalStackLayout>

            <ScrollView>

                <StackLayout>

                    <Grid>

                        <Grid.RowDefinitions>

                            <RowDefinition />

                        </Grid.RowDefinitions>

                        <Grid.ColumnDefinitions>

                            <ColumnDefinition />

                            <ColumnDefinition />

                        </Grid.ColumnDefinitions>



                        <Image

                    Grid.Column="0"

                    Source="logo.png"

                    WidthRequest="150"

                    HorizontalOptions="Start"

                    VerticalOptions="Start"

               />



                        <Label

                    TextColor="Black"

                    Grid.Column="1"

                    Text="TODO"

                    FontSize="35"

                    HorizontalOptions="Start"

                    VerticalOptions="Start"

                    Margin="23"

                    

                    />



                    </Grid>



                    <Grid BackgroundColor="#24D4A3">

                        <Grid.RowDefinitions>

                            <RowDefinition />

                            <RowDefinition />

                        </Grid.RowDefinitions>

                        <Grid.ColumnDefinitions>

                            <ColumnDefinition />

                            <ColumnDefinition />

                        </Grid.ColumnDefinitions>



                        <ListView

                Grid.ColumnSpan="2"

                Grid.RowSpan="2"

                RowHeight="100"

                 x:Name="listview"

                ItemsSource="{Binding Notes}" >

                            <ListView.ItemTemplate>

                                <DataTemplate >
                                    <ViewCell>

                                 

                                        <Grid BackgroundColor="#24D4A3" >

                                            <Grid.RowDefinitions>

                                                <RowDefinition Height="auto"/>

                                            </Grid.RowDefinitions>

                                            <Grid.ColumnDefinitions>

                                                <ColumnDefinition Width="auto"/>

                                            </Grid.ColumnDefinitions>

                                            <Button BackgroundColor="#DEABF5"

                                        Text="{Binding Title}"

                                        BorderWidth="2"

                                        TextColor="Black"

                                        FontSize="28"

                                        Margin="20"

                                        CornerRadius="100"

                                        WidthRequest="350"

                                        HeightRequest="70"

                                        HorizontalOptions="Center"

                                        VerticalOptions="Start"/>


                                            <Button

                                        BindingContext="{Binding Id}"

                                       Text="Delete"
                                          

                                        BorderWidth="2"

                                        BorderColor="Black"

                                        BackgroundColor="White"

                                       WidthRequest="45"

                                        HeightRequest="45"

                                        CornerRadius="35"

                                        Margin="0,0,260,0"

                                        />

                                        </Grid>

                                    </ViewCell>
                                </DataTemplate>

                            </ListView.ItemTemplate>

                        </ListView>

                    </Grid>

                </StackLayout>

            </ScrollView>

        </VerticalStackLayout>

    </RefreshView>

Note:

 public class Note 
{
    public int Id { get; set; }
    public string Title { get; set; }

    public Note(int id, string title)
    {
         Id = id;
         Title = title;
     }
     
}

  • Related