在Xamarin表单中使用Prism在ContentPages之间导航可维护NavigationParameters

时间:2018-10-22 21:10:52

标签: c# mvvm xamarin.forms prism

使用Prism中的NavigationParameters集合,我们将一个对象从一个ContentPage传递到另一个以模式显示的ContentPage。

模态允许用户编辑数据。如果用户决定取消编辑表单,我们会致电:

NavigationService.GoBackAsync(null, true). 

导航回到上一页后,传递给模态的原始属性已更新为已编辑的值,而无需对其进行设置。

是否在NavigateAsync中传递了NavigationParameters作为参考?防止这种情况发生的最好方法是什么?

1 个答案:

答案 0 :(得分:1)

  

使用Prism中的NavigationParameters集合,我们传递了 object [...] [Emphasis mine]

您正在NavigationParameters中设置一个对象。类(对象)的实例通过C#中的引用传递,结构的实例通过值传递。对于结构,存在用于复制和比较值的语义(即分别复制和比较所有公共属性),但是对于类,没有类似的语义。

请参阅documentation

  

由于类是引用类型,所以类对象的变量保存对托管堆上对象地址的引用。如果将相同类型的第二个对象分配给第一个对象,则两个变量都将引用该地址处的对象。

为了防止原始对象被更新,您必须在操作之前复制对象(我在传递它之前先对其进行了复制,但是您可以在目标位置将其复制网站)。如果您的类仅包含值类型属性,则浅表副本就足够了,即您创建了一个方法(或属性,但这可能会产生误导),该方法返回已复制所有值的类的新对象

class MyClass
{
    int Value1 { get; set; }
    float Value2 { get; set; }

    public MyClass Copy()
    {
        var copy = new MyClass()
                       {
                           Value1 = this.Value1,
                           Value2 = this.Value2
                       }
        return copy;
    }
}

如果对象本身包含引用类型,则可能必须创建一个深层副本

class MyClass
{
    MyClass2 Reference { get; set; }

    public MyClass Copy()
    {
        var copy = new MyClass()
                       {
                           Reference = this.Reference.Copy()
                       }
        return copy;
    }
}

当然,那些人也必须实现Copy()方法。