从外部页面添加到 ObservableCollection 的新元素不会持久化

New elements added to ObservableCollection from external Page are not persisted

我有两个页面。第一个我想查看 ObservableCollection 中的每个元素,第二个我想向 ObservableCollection 添加新元素。当我给出断点时,我看到 ObservableCollection 有新元素,但是当我回到第一页时,新元素不存在。我该怎么办?

有代码

        public ListViewFlascardViewModel()
    {
        GoToAddFlashcard = new Command(goToAddFlashcard);
        Fiszka = new ObservableCollection<Flashcard>();
        Fiszka.Add(new Flashcard {Name = "hello" });         
    }
    
    
    public Command GoToAddFlashcard { get; }
    Flashcard flashcard = new Flashcard();        

    async void goToAddFlashcard()
    {
        await Shell.Current.GoToAsync(nameof(View.NoweFiszki));;            
    }

    public ObservableCollection<Flashcard> Fiszka { get; set; }
}

还有第二页:

 class NoweFiszkiViewModel
{
    public Command SaveFlashcard { get; }
    public NoweFiszkiViewModel()
    {
       
        SaveFlashcard = new Command(save);
    }


    ListViewFlascardViewModel list = new ListViewFlascardViewModel();
   

    private async void save()
    {
        list.Fiszka.Add(new Flashcard { Name = "Bye" });            
         await Shell.Current.GoToAsync("..");
    }
}

我尝试了很多东西,但没有任何帮助。我是 C# 的新人,我将不胜感激。

我添加了整个代码。

有风景

ListViewFlashcard

<ContentPage 
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
xmlns:viewmodels="clr-namespace:MVVM.ViewModel" 
xmlns:model="clr-namespace:MVVM.Model"
x:Class="MVVM.View.ListViewFlashcard"   
x:DataType="viewmodels:ListViewFlascardViewModel"
>

<ContentPage.BindingContext>
    <viewmodels:ListViewFlascardViewModel/>        
</ContentPage.BindingContext>
<StackLayout>
    
    <Button 
            Command="{Binding GoToAddFlashcard}"
            Text="Click Me"/>
    
    <ListView
        ItemsSource="{Binding Fiszka}">
        <ListView.ItemTemplate>
            <DataTemplate x:DataType="model:Flashcard">
                <TextCell Text="{Binding Name}"/>
            </DataTemplate>
        </ListView.ItemTemplate>

    </ListView>        
</StackLayout>

NoweFiszki

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
         xmlns:viewmodels="clr-namespace:MVVM.ViewModel"
         x:Class="MVVM.View.NoweFiszki">
<ContentPage.BindingContext>
    <viewmodels:NoweFiszkiViewModel/>
</ContentPage.BindingContext>
<ContentPage.Content>
    <StackLayout>
        <Entry Text="{Binding Text, Mode=TwoWay}"/>
        <Button Text="Save"
                Command="{Binding SaveFlashcard}"/>
    </StackLayout>
</ContentPage.Content>

和型号

抽认卡

    public class Flashcard
{
    public string Name { get; set; }
}

和 AppShell

<Shell xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="MVVM.AppShell"
   xmlns:local="clr-namespace:MVVM.View"
   >   
<FlyoutItem Title="Add Flashcard" Icon="icon_about.png">
    <ShellContent ContentTemplate="{DataTemplate local:ListViewFlashcard}"/>
</FlyoutItem>
    public partial class AppShell : Xamarin.Forms.Shell
{
    public AppShell()
    {
        InitializeComponent();
        Routing.RegisterRoute(nameof(NoweFiszki), typeof(NoweFiszki));            
    }

}

都是我写的

您的代码中有几处需要更正:

NoweFiszkiViewModel 中,您每次都在创建 ListViewFlascardViewModel 的新实例,并在该新实例上添加元素,这不会影响ListViewFlashcard 实际绑定的实例。

要解决此问题,您必须在 ListViewFlashcard.xaml.cs 中创建一个 public static ListViewFlascardViewModel 并为其设置绑定上下文,如下所示

ListViewFlashcard.xaml.cs

public static ListViewFlascardViewModel vm { get; set; }

public ListViewFlashcard()
{
    InitializeComponent();
    vm = new ListViewFlascardViewModel();
}

protected override void OnAppearing()
{
    base.OnAppearing();
            
    BindingContext = vm;
}

然后更正ListViewFlashcard.xaml如下

ListViewFlashcard.xaml

<!--<ContentPage.BindingContext>
        <viewmodels:ListViewFlascardViewModel/>
    </ContentPage.BindingContext>-->
<StackLayout>
    <Button 
        Command="{Binding GoToAddFlashcard}"
        Text="Click Me"/>

    <ListView ItemsSource="{Binding Fiszka}">
        <ListView.ItemTemplate>
            <DataTemplate x:DataType="viewmodels:Flashcard">
                <TextCell Text="{Binding Name}"/>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>

最后你必须更正 NoweFiszkiViewModel.cs 如下,将新元素添加到 public static 视图模型:

NoweFiszkiViewModel.cs

public Command SaveFlashcard { get; }

public NoweFiszkiViewModel()
{
    SaveFlashcard = new Command(save);
}

//ListViewFlascardViewModel list = new ListViewFlascardViewModel();

private async void save()
{
    ListViewFlashcard.vm.Fiszka.Add(new Flashcard { Name = "Bye" });
    await Shell.Current.GoToAsync("..");
}