使用Prism中的NavigationParameters集合,我们将一个对象从一个ContentPage传递到另一个以模式显示的ContentPage。
模态允许用户编辑数据。如果用户决定取消编辑表单,我们会致电:
NavigationService.GoBackAsync(null, true).
导航回到上一页后,传递给模态的原始属性已更新为已编辑的值,而无需对其进行设置。
是否在NavigateAsync中传递了NavigationParameters作为参考?防止这种情况发生的最好方法是什么?
答案 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()
方法。