Search code examples
c#xamlmaui

Why does the listview display the items incorrectly after I remove them in .NET MAUI?


Firstscreen with all the notes.

After I deleted the first note!

I have recently started programming with .NET MAUI. The elements are correctly removed in the C# list. However, after deleting the remaining elements are only partially displayed. That means that only e.g. the 4th element is displayed. For the other elements only an empty bar is displayed.

My code so far: XAML:

<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">
                    <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}"  
                                            Clicked="onNoteSelected"
                                            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" 
                                Padding="2,0,0,0"/>
                    </Grid>
            </StackLayout>
        </ScrollView>
    </VerticalStackLayout>

C#:

public partial class MainPage : ContentPage
    { 

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

        notes.Add(new Note(1, "My Note1", "I'm ugly"));
        notes.Add(new Note(2, "My Note2", "I'm short"));
        notes.Add(new Note(3, "My Note3", "I'm smart"));
        notes.Add(new Note(4, "My Note4", "I'm smart"));
        //notes.Add(new Note(6, "My Note6", "I'm smart"));
        //notes.Add(new Note(7, "My Note7", "I'm smart"));
        //notes.Add(new Note(8, "My Note8", "I'm smart"));
        //notes.Add(new Note(9, "My Note9", "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);
        }
    
    }

    async void onNoteSelected(object sender, EventArgs e)
    {
        Button button= (Button) sender ;

        var id = (int)button.BindingContext;

        //await Shell.Current.GoToAsync("NotePage" + id);
    }
}

I would be grateful for any help :)


Solution

  • To delete the item, since you are using ListView, you can delete the via Button click. However, you need to delete the item from bottom to top in order.

    Code-behind:

    public partial class MainPage : ContentPage 
    {
    
        
    
        public ObservableCollection<Note> Notes { get; private set; } = new ObservableCollection<Note>();
    
    
    
        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 void Button_Clicked(object sender, EventArgs e)
        {
            var note = (Button)sender;
    
    
            Note listnote = (from itm in Notes
                             where itm.Id == note.CommandParameter.ToString()
    
                             select itm).FirstOrDefault<Note>();
    
            Notes.Remove(listnote);
        }
    
    
    }
    
    

    Xaml:

    
    
            <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
    
                                          
    
                                           Text="Delete"
                                              Clicked="Button_Clicked"
                                             CommandParameter="{Binding Id}"
    
                                            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>
    
    
    
    

    Note:

     public class Note 
    {
        public string Id { get; set; }
        public string Title { get; set; }
    
        public Note(string id, string title)
        {
             Id = id;
             Title = title;
         }
         
    }