在关闭之前向父视图模型发送异步消息的最佳方法是什么?

时间:2014-01-15 09:29:26

标签: xamarin.android mvvmcross

我正在从“父”视图模型中打开一个对话框视图模型。关闭对话框后,我希望父视图模型刷新更新的字段。

INotifyPropertyChange不可用,因为可以解除并重新创建Android活动。起初我认为这不是问题:如果重新创建活动,则视图会刷新。所以我尝试用父视图拥有的对象实例打开对话框。但是mvvmcross不允许你这样做:viewmodel构造函数参数必须是可序列化的和简单类型。这是有道理的,因为当活动被破坏时,这些对象使用的内存可能会被释放。

IMvxMessenger似乎还有很长的路要走。在关闭之前从对话框中发布刷新消息。父订阅此消息并相应地刷新属性。

但IMvxMessenger.Publish将sender对象作为参数。这会导致内存泄漏吗?这会在内存中保留正在关闭的视图模型吗?应用稳定性有危险吗?

2 个答案:

答案 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插件的源代码,你可以在这里找到它,我相信:

https://github.com/MvvmCross/MvvmCross/tree/3.0.14/Plugins/Cirrious/Messenger/Cirrious.MvvmCross.Plugins.Messenger

HTH, 巴氏