Xamarin.forms 如何在不刷新/重新加载xamarin表单的情况下转到上一页

Xamarin.forms 如何在不刷新/重新加载xamarin表单的情况下转到上一页,xamarin.forms,Xamarin.forms,因此,我在PageA中有一个ListView,当我点击一个按钮时,它会将我重定向到PageB,现在我在PageB上做一些事情,但是当我点击Ok/Submit时,我需要将这些数据传递到PageA,并加载PageA,而不刷新或重新加载它,这将导致刷新ListView/PageA PageB上的每个更新基本上都是PageA上ListView的每个互动程序的一些内容更新,所以基本上当我单击第一个项目并返回时,它应该只更新该项目 我可以通过MessagingCenter在PageA上订阅,并使用字典将数据

因此,我在PageA中有一个ListView,当我点击一个按钮时,它会将我重定向到PageB,现在我在PageB上做一些事情,但是当我点击Ok/Submit时,我需要将这些数据传递到PageA,并加载PageA,而不刷新或重新加载它,这将导致刷新ListView/PageA PageB上的每个更新基本上都是PageA上ListView的每个互动程序的一些内容更新,所以基本上当我单击第一个项目并返回时,它应该只更新该项目

我可以通过MessagingCenter在PageA上订阅,并使用字典将数据发送回PageB,但如果我使用Navigation.PopAsync,它只会刷新PageA上的数据

任何可行的解决方案,因为这是任何应用程序都会有的一个常见功能,但出于某种原因,我无法将其可视化

这是我的密码 PageB

var data=newdictionary();
数据。添加(“1”、“1”);
数据。添加(“2”、“2”);
数据。添加(“3”、“3”);
数据。添加(“4”、“4”);
数据。添加(“5”、“5”);
发送(数据,“提交数据”);
Navigation.popsync();
代码PageA

 MessagingCenter.Subscribe<Dictionary<string, string>>(this, "SubmitData", (sender) =>
         {
             try
             {
                 sender.TryGetValue("1", out result[0]);
                 sender.TryGetValue("2", out result[1]);
                 sender.TryGetValue("3", out result[2]);
                 sender.TryGetValue("4", out result[3]);
                 sender.TryGetValue("5", out result[4]);
             }
MessagingCenter.Subscribe(此“提交数据”,(发件人)=>
{
尝试
{
sender.TryGetValue(“1”,输出结果[0]);
sender.TryGetValue(“2”,输出结果[1]);
sender.TryGetValue(“3”,输出结果[2]);
sender.TryGetValue(“4”,输出结果[3]);
sender.TryGetValue(“5”,输出结果[4]);
}
任何帮助都将不胜感激

但是,当我单击Ok/Submit时,我需要将此数据传递给PageA,并加载PageA,而不刷新或重新加载它,这将导致刷新ListView/PageA,PageB上的每个更新基本上是对PageA上ListView的每个磁贴的一些内容更新,因此基本上,当我单击第一个项目并返回时,它应该只更新该项目

根据您的描述,我猜您希望从PageA的ListView中选择一个项目,然后将所选项目传递给PageB,进行一些更改,然后返回PageA并在ListView中更新该项目,对吗

如果是,我建议您可以查看以下代码:

第A页:

 <StackLayout>
        <ListView
            x:Name="listview1"
            ItemsSource="{Binding list}"
            SelectedItem="{Binding selecteditem}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout>
                            <Label Text="{Binding username}" />
                            <Label Text="{Binding age}" />
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

        <Button
            x:Name="btn1"
            Clicked="btn1_Clicked"
            Text="redirect to another page" />
    </StackLayout>

 public partial class Page8 : ContentPage
{
    public viewmodel3 viewmodel { get; set; }
    public Page8()
    {
        viewmodel = new viewmodel3();

        InitializeComponent();

        this.BindingContext = viewmodel;
    }

    private void btn1_Clicked(object sender, EventArgs e)
    {
        Navigation.PushAsync(new Page9(viewmodel.selecteditem));
    }     
}

public class viewmodel3:ViewModelBase
{
    public ObservableCollection<model3> list { get; set; }
    private model3 _selecteditem;
    public model3 selecteditem
    {
        get { return _selecteditem; }
        set
        {
            _selecteditem = value;
            RaisePropertyChanged("selecteditem");

        }
    }

    public viewmodel3()
    {
        list = new ObservableCollection<model3>()
        {
            new model3(){username="cherry",age=29},
            new model3(){username="barry",age=32},
            new model3(){username="wendy",age=27}
        };
        MessagingCenter.Subscribe<model3>(this, "Update", (person) =>
        {

            updateitem(person);
        });

    }
    private void updateitem(model3 item)
    {
        var person = list.FirstOrDefault(p => p.username == item.username);
        if (person != null)
        {
            person.age = item.age;
        }
    }      
}
public class model3:ViewModelBase
{
    private string _username;
    public string username
    {
        get { return _username; }
        set
        {
            _username = value;
            RaisePropertyChanged("username");
        }
    }
    private int _age;
    public int age
    {
        get { return _age; }
        set
        {
            _age = value;
            RaisePropertyChanged("age");
        }
    }
}

公共部分类第8页:内容页
{
公共视图模型3视图模型{get;set;}
公共页8()
{
viewmodel=新的viewmodel3();
初始化组件();
this.BindingContext=viewmodel;
}
私有无效btn1_已单击(对象发送方,事件参数e)
{
Navigation.PushAsync(新页面9(viewmodel.selecteditem));
}     
}
公共类viewmodel3:ViewModelBase
{
公共ObservableCollection列表{get;set;}
私有模式3 _selecteditem;
公共模型3 selecteditem
{
获取{return\u selecteditem;}
设置
{
_选择editem=值;
RaisePropertyChanged(“selecteditem”);
}
}
公共视图模型3()
{
列表=新的ObservableCollection()
{
新模型3(){username=“cherry”,年龄=29},
新模型3(){username=“barry”,age=32},
新模型3(){username=“wendy”,age=27}
};
MessagingCenter.Subscribe(此“更新”,(个人)=>
{
更新项(人);
});
}
私有无效更新项(模型3项)
{
var person=list.FirstOrDefault(p=>p.username==item.username);
if(person!=null)
{
person.age=item.age;
}
}      
}
公共类模型3:ViewModelBase
{
私有字符串\u用户名;
公共字符串用户名
{
获取{return\u username;}
设置
{
_用户名=值;
RaisePropertyChanged(“用户名”);
}
}
私人互联网;
公共信息
{
获取{return\u age;}
设置
{
_年龄=价值;
提高产权变更(“年龄”);
}
}
}
第b页:

 <StackLayout>
        <Entry x:Name="username" />
        <Entry x:Name="age" />

        <Button
            x:Name="btnsub"
            Clicked="btnsub_Clicked"
            Text="submit" />
    </StackLayout>

 public partial class Page9 : ContentPage
{
    public model3 item;
    public Page9(model3 m)
    {
        InitializeComponent();
        item = new model3();

        item.username = m.username;
        item.age = m.age;

        username.Text = m.username;
        age.Text = m.age.ToString();
    }

    private void btnsub_Clicked(object sender, EventArgs e)
    {
         if(item.username!=username.Text || item.age!=int.Parse(age.Text))
        {
            MessagingCenter.Send(new model3() { username = username.Text, age = int.Parse(age.Text) }, "Update");
        }
        Navigation.PopAsync();

    }
}

公共部分类第9页:内容页
{
公共模式3项目;
公共页9(型号3 m)
{
初始化组件();
项目=新模型3();
item.username=m.username;
item.age=m.age;
username.Text=m.username;
age.Text=m.age.ToString();
}
已单击私有void btnsub_(对象发送方,事件参数e)
{
if(item.username!=username.Text | | item.age!=int.Parse(age.Text))
{
Send(newmodel3(){username=username.Text,age=int.Parse(age.Text)},“Update”);
}
Navigation.popsync();
}
}

您在OnAppearing中做了什么吗?如果PageB只是从PageA编辑一个项目,您应该能够将该项目传递到PageB并编辑它,而无需使用MessagingCenter是的,我正在获取PageA listview的数据……当您导航回某个页面时,OnAppearing可能会触发,因此您需要检查您是否没有执行数据多次加载
 <StackLayout>
        <Entry x:Name="username" />
        <Entry x:Name="age" />

        <Button
            x:Name="btnsub"
            Clicked="btnsub_Clicked"
            Text="submit" />
    </StackLayout>

 public partial class Page9 : ContentPage
{
    public model3 item;
    public Page9(model3 m)
    {
        InitializeComponent();
        item = new model3();

        item.username = m.username;
        item.age = m.age;

        username.Text = m.username;
        age.Text = m.age.ToString();
    }

    private void btnsub_Clicked(object sender, EventArgs e)
    {
         if(item.username!=username.Text || item.age!=int.Parse(age.Text))
        {
            MessagingCenter.Send(new model3() { username = username.Text, age = int.Parse(age.Text) }, "Update");
        }
        Navigation.PopAsync();

    }
}