wpf 我正在将我的视图模型耦合到CommunityToolkit的MessagingCenter,MVVM?

9fkzdhlc  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(113)

作为上下文,我解释了我的情况。我有一个视图模型,当在视图模型中选择了所选项目时,我想通知视图,因为我希望列表视图滚动到所选项目。
一个选项是使用工具包的MessagingCenter,它以这种方式在视图模型中使用:

private void Refresh(IEnumerable<MyType> paramItems)
{
    MyCollection.Clear();

    foreach (MyType iterator in paramItems.OrderByDescending(x => x.MyDate))
    {
        MyCollection.Add(iterator);
    }
    // I get the first item in Collection
    MyType item = MyCollection[0];
    MessagingCenter.Send<MainPageViewModel,MyType>(this, "Hi",item);
}

在视图中,在代码后面,我订阅了这条消息:

public MainPage()
{
    InitializeComponent();
    this.BindingContext = new MainPageViewModel();
    MessagingCenter.Subscribe<MainPageViewModel,MyType>(this, "Hi", (sender,Item) =>
    {       
        //we set the x:Name="mylistview" for ListView in xaml
        mylistview.ScrollTo(Item, ScrollToPosition.Start,false);
    });
}

在视图模型中,我使用工具箱的MessagingCenter,所以我认为这是将视图模型的依赖项添加到工具箱中。
所以在后面的代码中我必须添加订阅方法的代码,我在想另一种解决方案:
观点:

public partial class MainPage : ContentPage
{
    MainPageViewModel _viewModel;


    public RegistroHorarioView(mainPageViewModel paramViewModel)
    {
        InitializeComponent();

        BindingContext = paramViewModel;
        _viewModel = paramViewModel;

        paramViewModel.PropertyChanged += OnProperyChangedInViewModel;
    }

    private void OnProperyChangedInViewModel(object? sender, PropertyChangedEventArgs e)
    {
        if(string.CompareOrdinal(e.PropertyName, nameof(_viewModel.MySelectedItem)) == 0)
        {
            this.MyListView.ScrollTo(_viewModel.MySelectedItem, ScrollToPosition.Start, false);
        }
    }
}

视图模型如何实现NotifyPropertyChanged,我可以订阅这个事件,然后检查哪个属性已经更改,并执行这种情况下所需的代码。
这是有代码的代码背后,但与MessagingCenter我必须做同样的事情。
这是我的视图模型:

private void Refresh(IEnumerable<MyType> paramItems)
{
    MyCollection.Clear();

    foreach (MyType iterator in paramItems.OrderByDescending(x => x.MyDate))
    {
        MyCollection.Add(iterator);
    }
    // I get the first item in Collection
    //MySelectedItem is the property of the view model for the selected item.
    MySelectedItem = MyCollection[0];
}

在本例中,我没有使用MessagingCenter,所以我想我减少了视图模型与其他资源的耦合。
但我不知道这是否是一个好的选择,或者使用MessagingCenter更好,因为它有我不知道的优点。
谢谢。

cnh2zyt3

cnh2zyt31#

您基本上使用信使来避免消息的发布者和订阅者之间的紧密耦合,这会增加一些额外的复杂性。其思想是每个组件都依赖于单个信使,而不是与之间接通信的每个其他组件。
如果视图已经对视图模型有很强的依赖性,就像您发布的代码一样,您还可以直接订阅视图模型的PropertyChanged事件,而不需要使用信使。
只需要记住显式取消订阅事件,以避免在视图模型超过视图的情况下发生内存泄漏。

相关问题