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.
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
IMvxMessengerfor you, so you don't need to manually instantiate it. - Threading: If your target method updates UI elements, make sure to use
MvxMainThreadTaskScheduler.Instancein the subscribe call to ensure the handler runs on the UI thread. - Subscription Cleanup: Always dispose of the
MvxSubscriptionTokenwhen the ViewModel is destroyed (like inViewDisappeared) to prevent memory leaks.
内容的提问来源于stack exchange,提问作者Sven0567

