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



我有两个页面。第一个我想看到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#的新人,我将感激每一个帮助。

我添加了整个代码。

There is view

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

一切都是我写的。

你的代码中有几件事需要纠正:

在<<p> strong> 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("..");
}

最新更新