首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从外部页面添加到ObservableCollection的新元素不会持久化

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

Stack Overflow用户
提问于 2021-09-21 04:09:30
回答 1查看 121关注 0票数 2

我有两页。在第一个部分中,我希望看到ObservableCollection中的每个元素,而第二个元素则希望向ObservableCollection中添加新元素。当我给出断点时,我会看到ObservableCollection有新元素,但是当我返回到第一页时,新元素就不存在了。我该怎么办?

有代码

代码语言:javascript
复制
        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; }
}

,还有第二页:

代码语言:javascript
复制
 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

代码语言:javascript
复制
<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

代码语言:javascript
复制
<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>

模型

闪存卡

代码语言:javascript
复制
    public class Flashcard
{
    public string Name { get; set; }
}

和AppShell

代码语言:javascript
复制
<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>
代码语言:javascript
复制
    public partial class AppShell : Xamarin.Forms.Shell
{
    public AppShell()
    {
        InitializeComponent();
        Routing.RegisterRoute(nameof(NoweFiszki), typeof(NoweFiszki));            
    }

}

这是我所写的一切。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-21 06:36:56

有几件事必须在您的代码中纠正:

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

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

ListViewFlashcard.xaml.cs

代码语言:javascript
复制
public static ListViewFlascardViewModel vm { get; set; }

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

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

然后更正ListViewFlashcard.xaml,如下所示

ListViewFlashcard.xaml

代码语言:javascript
复制
<!--<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

代码语言:javascript
复制
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("..");
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69263275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档