dotnet icon indicating copy to clipboard operation
dotnet copied to clipboard

The Messenger can't send Message by using the official sample from "MVVM Toolkit Sample App" software

Open wxysy opened this issue 3 years ago • 1 comments

Describe the bug

When I learn the Messenger part of CommunityToolkit.Mvvm by following the official sample from "MVVM Toolkit Sample App" software, I find that the sample code doesn't work when I use them in my program. 204764854-3d13f1ab-b21a-4206-8f2a-62ad12ba3760

1

Regression

No response

Steps to reproduce

1.Condition
Framework: .Net 6 WPF 
      IDE: VisualStudio Professional 17.4.2;
 Language: C#

2.Code
The C# Code:

/// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    [ObservableObject]
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            //UserReceiver = new UserReceiverViewModel();
            //UserSender = new UserSenderViewModel();
        }

        public UserReceiverViewModel UserReceiver { get; } = new();
        public UserSenderViewModel UserSender { get; } = new();

        private void Btn_SendMes_Click(object sender, RoutedEventArgs e)
        {
            UserSender.SendUserMessage();
            tb_Show.Text += "信息已发送\n";
            tb_Show.Text += $"接收的信息:{UserReceiver.MyStringReceive}\n";
        }
    }

/// <summary>
    /// 用于SendingMessage的信息类
    /// </summary>
    /// <typeparam name="T">该类承载的信息类型</typeparam>
    public sealed class SendingMessageCarrier<T> : ValueChangedMessage<T>
    {
        public SendingMessageCarrier(T value) : base(value)
        {
        }
    }

public class UserSenderViewModel : ObservableRecipient
    {
        public string MyString { get; set; } = "wxy";

        public void SendUserMessage()
        {
            var carrier = new SendingMessageCarrier<string>(MyString);
            Messenger.Send(carrier);
            //WeakReferenceMessenger.Default.Send(carrier);
            //WeakReferenceMessenger.Default.Send(carrier, 12);

            if (MyString == "wxy")
            {
                MyString = "zbk";
            }
            else
            {
                MyString = "wxy";
            }
        }
    }

public class UserReceiverViewModel : ObservableRecipient
    {
        public string MyStringReceive { get; set; } = string.Empty;

        protected override void OnActivated()
        {
            //base.OnActivated();
            Messenger.Register<UserReceiverViewModel, SendingMessageCarrier<string>>(this, MessageHandler);
            //WeakReferenceMessenger.Default.Register<UserReceiverViewModel, SendingMessageCarrier<string>>(this, MessageHandler);
            //WeakReferenceMessenger.Default.Register<UserReceiverViewModel, SendingMessageCarrier<string>, int>(this, 12, MessageHandler);
        }

        private void MessageHandler(UserReceiverViewModel recipient, SendingMessageCarrier<string> message)
        {
            recipient.MyStringReceive = message.Value;
        }
    }


The XAML Code
```xaml
<Window x:Class="LearnMessenger.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:LearnMessenger"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <TextBox x:Name="textBox" HorizontalAlignment="Left" Margin="10,10,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="385" FontSize="18" IsReadOnly="True" Height="207"/>
        <TextBox x:Name="tb_Show" Margin="400,10,10,0" TextWrapping="Wrap" VerticalAlignment="Top" FontSize="18" IsReadOnly="True" Height="207"/>
        <Button x:Name="btn_SendMes" Click="Btn_SendMes_Click" Content="SendMessage" HorizontalAlignment="Left" Margin="24,365,0,0" VerticalAlignment="Top" Height="46" Width="143"/>
    </Grid>
</Window>

3.Click on Button Control(active the method ) 4.the UserReceiverViewModel instance cann't receive message from UserSenderViewModel instance.



### Expected behavior

I want to know why the code doesn't work and tell me how to fix it.

### Screenshots

_No response_

### IDE and version

VS 2022

### IDE version

17.4.2

### Nuget packages

- [ ] CommunityToolkit.Common
- [ ] CommunityToolkit.Diagnostics
- [ ] CommunityToolkit.HighPerformance
- [X] CommunityToolkit.Mvvm (aka MVVM Toolkit)

### Nuget package version(s)

8.0.0

### Additional context

_No response_

### Help us help you

Yes, I'd like to be assigned to work on this item

wxysy avatar Nov 30 '22 09:11 wxysy

I got this working on Android using .Net 7 targeting API 33 running on Android 31. It's even working when called from a foreground service. It's working on iOS using .Net 7.0 targeting iOS 16, but only when called from a page behind or viewmodel. If I call it from a service, it does not work. There is no error being reported in the try catch. Is it supposed to work from AppDelegate, a service etc... in iOS??? I'm using version 1.3.0 of the toolkit. I'm going to upgrade and see what happens.

I used this video to setup the pub/sub messenger. https://www.youtube.com/watch?v=vD17OetzGXc

I just upgraded to Maui Toolkit 3.0.0. It doesn't send a message from AppDelegate, a service etc.... Is it supposed to???

faceoffers28 avatar Dec 08 '22 17:12 faceoffers28