You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MvvmCross iOS Messenger使用求助:跨ViewModel触发带参方法

Hey there! No worries at all—starting with MvvmCross can feel a bit overwhelming at first, but MvxMessenger is absolutely the right tool for this cross-viewmodel communication. Let me walk you through a complete, step-by-step example tailored to your needs.

Using MvxMessenger to Trigger a Method with String Parameter Between ViewModels

Step 1: Define a Custom Message Class

First, we need a message type to carry your string parameter. Create a class that inherits from MvxMessage—this will hold the data we want to pass between viewmodels:

public class SearchTriggerMessage : MvxMessage
{
    // The string parameter you want to pass
    public string SearchQuery { get; }

    public SearchTriggerMessage(object sender, string searchQuery) : base(sender)
    {
        SearchQuery = searchQuery;
    }
}

Step 2: Send the Message from FilterViewModel

In your FilterViewModel, inject IMvxMessenger and use it to publish the message when your button is clicked. We'll use an MvxCommand to bind to the button's click event:

public class FilterViewModel : MvxViewModel
{
    private readonly IMvxMessenger _messenger;
    public ICommand TriggerSearchCommand { get; }

    // Inject IMvxMessenger via constructor (MvvmCross IoC handles this automatically)
    public FilterViewModel(IMvxMessenger messenger)
    {
        _messenger = messenger;
        TriggerSearchCommand = new MvxCommand(TriggerSearch);
    }

    private void TriggerSearch()
    {
        // Replace this with your actual string parameter (e.g., from a text field)
        var searchQuery = "Your desired search term here";
        
        // Publish the message with the sender (this ViewModel) and the query
        _messenger.Publish(new SearchTriggerMessage(this, searchQuery));
    }
}

Step 3: Subscribe to the Message in SearchHistoryViewModel

Now, in SearchHistoryViewModel, we'll subscribe to the SearchTriggerMessage and call your target method when the message is received. Don't forget to manage the subscription token to avoid memory leaks:

public class SearchHistoryViewModel : MvxViewModel
{
    private readonly IMvxMessenger _messenger;
    private MvxSubscriptionToken _searchTriggerSubscription;

    public SearchHistoryViewModel(IMvxMessenger messenger)
    {
        _messenger = messenger;
        SubscribeToSearchTriggers();
    }

    private void SubscribeToSearchTriggers()
    {
        // Subscribe to the message and define the handler
        _searchTriggerSubscription = _messenger.Subscribe<SearchTriggerMessage>(message =>
        {
            // Call your method with the received string parameter
            HandleSearchTrigger(message.SearchQuery);
        });

        // Optional: If you need to run the handler on the UI thread (e.g., updating UI elements), use:
        // _searchTriggerSubscription = _messenger.Subscribe<SearchTriggerMessage>(message =>
        // {
        //     HandleSearchTrigger(message.SearchQuery);
        // }, MvxMainThreadTaskScheduler.Instance);
    }

    // Your target method with the string parameter
    private void HandleSearchTrigger(string searchQuery)
    {
        // Add your business logic here—e.g., load search history for the query
        Console.WriteLine($"Received search trigger with query: {searchQuery}");
    }

    // Clean up the subscription when the ViewModel is no longer needed
    public override void ViewDisappeared()
    {
        base.ViewDisappeared();
        _searchTriggerSubscription?.Dispose();
    }
}

Key Notes to Remember

  • Dependency Injection: MvvmCross's built-in IoC container will automatically resolve IMvxMessenger for you, so you don't need to manually instantiate it.
  • Threading: If your target method updates UI elements, make sure to use MvxMainThreadTaskScheduler.Instance in the subscribe call to ensure the handler runs on the UI thread.
  • Subscription Cleanup: Always dispose of the MvxSubscriptionToken when the ViewModel is destroyed (like in ViewDisappeared) to prevent memory leaks.

内容的提问来源于stack exchange,提问作者Sven0567

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:36:34