gpt4 book ai didi

c# - 使用 MVVM Light Messanger 代替事件

转载 作者:行者123 更新时间:2023-11-30 22:00:12 25 4
gpt4 key购买 nike

我正在为我当前的 WPF 项目使用 MVVM Light,我想知道什么时候应该使用 MVVM Light 的 WPF 事件消息传递。

WPF 事件:

MyControl.xaml

<ListView SelectionChanged="ListView_OnSelectionChanged" />

MyControl.cs

private MyViewModel ViewModel
{
get { return this.DataContext as MyViewModel; }
}

private void ListView_OnSelectionChanged( object sender, SelectionChangedEventArgs e )
{
this.ViewModel.ListViewSelectionChanged( ( (ListView) sender ).SelectedItems );
}

MVVM 轻型消息传递:

MyControl.cs

private void ListView_OnSelectionChanged( object sender, SelectionChangedEventArgs e )
{
Messenger.Default.Send( new ListViewSelectionMessage {SelectedItems = ((ListView)sender).SelectedItems} );
}

ListViewSelectionMessage.cs

public class ListViewSelectionMessage
{
public IList SelectedItems { get; set; }
}

MyViewModel

public class MyViewModel
{
MyViewModel()
{
Messenger.Default.Register<ListViewSelectionMessage>(this, this.ListViewSelectionChaged);
}

private void ListViewSelectionChaged( ListViewSelectionMessage message )
{
// ...
}
}

因为使用 Messanger,一切都可以很容易地解耦,所以我很想在任何地方都使用 Messanger。使用 Messanger 而不是 Events 有什么问题吗?或者这会产生我不知道的问题。谢谢!

最佳答案

通常,任何 MVVM 框架(Prism、MVVM Light)中的消息都是在具有插件架构的应用程序中松散耦合的组件之间进行通信的好方法,因为您可以通过共享库中声明的契约将消息从一个模块发送到另一个模块。在您单独开发应用程序或在小团队高技能程序员中使用它是可以的。

否则有一个很大的缺点:重构和调试非常困难,因为你不能只点击消息和“查找用法”你需要先去契约(Contract)(接口(interface))而不是“查找用法”,然后使用 Subscribe/Register 指令直观地查找位置。此外,开发人员通常会忘记取消订阅消息,因此当从一个模块发送并打算在同一模块中处理的消息将被错误地在其他模块中处理时,您将面临问题,因此这会导致意外行为并产生许多痛苦的错误。

以上所有内容均基于我的个人经验,因此结果可能会有所不同。请小心处理消息,它会很好地为您服务。同样在我看来,消息作为事件的替代品有点开销/过度设计,因为当您拥有紧密耦合的组件时,您并不真正需要它。

关于c# - 使用 MVVM Light Messanger 代替事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28728303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com