本示例演示了在一个简单的 WinForms 应用程序中,如何使用 CommunityToolkit.Mvvm
的消息机制来实现视图和视图模型之间的通信。这个示例应用程序包含两个窗体:一个主窗体用于发送消息,另一个窗体用于接收并显示消息内容。
CommunityToolkit.Mvvm
包。创建一个名为 User.cs
的用户类。
C#public class User
{
public string Name { get; set; }
public int Age { get; set; }
public User(string name, int age)
{
Name = name;
Age = age;
}
}
创建一个名为 UserMessage.cs
的新类文件,并定义一个消息类来传递用户的消息。
C#public class UserMessage : ValueChangedMessage<User>
{
public UserMessage(User value) : base(value)
{
}
}
创建一个名为 MainViewModel.cs
的新类文件,这个视图模型负责发送消息。
C#public partial class MainViewModel : ObservableObject
{
[ObservableProperty]
private string userName;
[ObservableProperty]
private int userAge;
[RelayCommand]
private void SendMessage()
{
var user = new User(UserName, UserAge);
WeakReferenceMessenger.Default.Send(new UserMessage(user));
}
}
在主窗体(Form1
)中,添加一个文本框(textBoxUserInput
)供用户输入消息,以及一个按钮(buttonSend
)用于发送消息。
修改主窗体的代码,使其使用 MainViewModel
并绑定 UI 元素。
C#public partial class Form1 : Form
{
private MainViewModel _viewModel;
public Form1()
{
InitializeComponent();
_viewModel = new MainViewModel();
// 设置数据绑定
txtName.DataBindings.Add("Text", _viewModel, nameof(_viewModel.UserName), false, DataSourceUpdateMode.OnPropertyChanged);
txtAge.DataBindings.Add("Text", _viewModel, nameof(_viewModel.UserAge), false, DataSourceUpdateMode.OnPropertyChanged);
// 绑定发送按钮的点击事件
btnSubmit.Click += (s, e) => _viewModel.SendMessageCommand.Execute(null);
}
}
创建第二个窗体(ReceiverForm
),并在其中添加一个标签(labelMessage
)用于显示接收到的消息。
修改 Form2
的代码,注册并处理 UserMessage
。
C#public Form2()
{
InitializeComponent();
WeakReferenceMessenger.Default.Register<UserMessage>(this, (r, m) =>
{
// 确保操作在 UI 线程上执行
this.Invoke(new Action(() =>
{
labelMessage.Text = $"Received user: {m.Value.Name}, Age: {m.Value.Age}";
}));
});
}
最后,修改主窗体的代码,在其中添加一个方法来打开 ReceiverForm
。
C#private void btnSubmit_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.Show();
}
不要忘记在主窗体的设计器中添加一个按钮,并为其 Click
事件绑定此方法。
通过上述步骤,我们创建了一个简单的 WinForms 应用程序,演示了如何使用 CommunityToolkit.Mvvm
的消息机制在视图和视图模型之间进行通信。这个示例展示了如何发送和接收消息,以及如何在 WinForms 应用程序中实现松散耦合的组件交互。这种通信方式非常适合复杂的应用程序架构,可以有效地提高代码的可维护性和扩展性。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!