XAML 列表视图未从observablecollection自动更新

yvfmudvl  于 2023-06-27  发布在  其他
关注(0)|答案(1)|浏览(135)

我已经开始用.NET MAUI编程了,遇到了一个小问题。不管怎么说,我试着在删除一个注解时自动更新我的列表视图。删除注解到目前为止有效。更新还没有,我该怎么做呢?
我试图解决我的问题的帮助下,各种职位在不同的在线论坛,但这些职位都没有帮助,所以我创建自己的。
我的代码到目前为止:
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#主页:

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

和我的“笔记本”

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; }
    }
ie3xauqp

ie3xauqp1#

您可以像下面这样使用RefreshView,我简化了您的代码,使其简洁但切中要害。要删除项目,因为您使用的是ListView,所以可以使用ItemSelected方法删除选定的项目。详细信息,请参阅响应项目选择。

代码隐藏:

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>

注:

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

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

相关问题