作为上下文,我解释了我的情况。我有一个视图模型,当在视图模型中选择了所选项目时,我想通知视图,因为我希望列表视图滚动到所选项目。
一个选项是使用工具包的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更好,因为它有我不知道的优点。
谢谢。
1条答案
按热度按时间cnh2zyt31#
您基本上使用信使来避免消息的发布者和订阅者之间的紧密耦合,这会增加一些额外的复杂性。其思想是每个组件都依赖于单个信使,而不是与之间接通信的每个其他组件。
如果视图已经对视图模型有很强的依赖性,就像您发布的代码一样,您还可以直接订阅视图模型的
PropertyChanged
事件,而不需要使用信使。只需要记住显式取消订阅事件,以避免在视图模型超过视图的情况下发生内存泄漏。