我正在从“父”视图模型中打开一个对话框视图模型。关闭对话框后,我希望父视图模型刷新更新的字段。
INotifyPropertyChange不可用,因为可以解除并重新创建Android活动。起初我认为这不是问题:如果重新创建活动,则视图会刷新。所以我尝试用父视图拥有的对象实例打开对话框。但是mvvmcross不允许你这样做:viewmodel构造函数参数必须是可序列化的和简单类型。这是有道理的,因为当活动被破坏时,这些对象使用的内存可能会被释放。
IMvxMessenger似乎还有很长的路要走。在关闭之前从对话框中发布刷新消息。父订阅此消息并相应地刷新属性。
但IMvxMessenger.Publish将sender对象作为参数。这会导致内存泄漏吗?这会在内存中保留正在关闭的视图模型吗?应用稳定性有危险吗?
答案 0 :(得分:1)
您可以尝试使用将在调用者中调用的操作。
public class DialogMessage
: MvxMessage
{
public DialogMessage(object sender) : base(sender)
{
}
public string Title { get; set; }
public string Message { get; set; }
public Style Buttons { get; set; }
public Action OkAction { get; set; }
public Action CancelAction { get; set; }
public Action YesAction { get; set; }
public Action NoAction { get; set; }
public enum Style
{
Ok,
YesNo
}
}
答案 1 :(得分:1)
IMvxMessenger似乎还有很长的路要走。从中发布刷新消息 关闭之前的对话框。父母订阅此消息并且 相应地刷新属性。
是的,这是要走的路,IMO。
但IMvxMessenger.Publish将sender对象作为参数。将 这导致内存泄漏?这会保留viewmodel吗? 结束,在记忆中?应用稳定性有危险吗?
我不这么认为,除非您将订阅者的事件处理程序中的发件人引用用于该邮件。例如,假设您的订阅者有:
_newProductToken = _messenger.Subscribe<NewProductMessage>( OnNewProductMessage, MvxReference.Strong );
您的邮件类看起来像这样:
class NewProductMessage : MvxMessage
{
public NewProductMessage( object p_sender, string p_code, string p_description )
: base(p_sender)
{
Code = p_code;
Description = p_sescription;
}
public string Code { get; set; }
public string Description { get; set; }
}
您的订阅者对邮件的事件处理程序如下所示:
private void OnNewProductMessage( NewProductMessage p_Product )
{
// Obviously this might cause an exception if the sender is removed by the time this line is exec'd
var myvar = p_Product.sender;
// But you could use the other properties of your message class of course...
ProductCode = p_Product.Code;
Description = p_Product.Description;
}
因此,这完全取决于MvxMessage类如何使用通过base(p_sender)
传递给它的发送方对象。你真的需要检查Messenger插件的源代码,你可以在这里找到它,我相信:
HTH, 巴氏