阅读量:0
Prism视图传参方式。
实际应用场景
点击tabitem中的列表数据,同步更新到ListStatic Region对应的界面。目前用两种方式实现了传参数据同步。
第一,事件聚合器(EventAggregator)
1. 定义事件
创建一个事件类,用于传递数据。
using Prism.Events; public class DataUpdateEvent : PubSubEvent<string> { }
点击tabitem中的列表 ,示例传参数据是string类型,什么参数类型都可以。
2. 注册事件聚合器
在 App.xaml.cs
中注册事件聚合器。
protected override void RegisterTypes(IContainerRegistry containerRegistry) { containerRegistry.RegisterSingleton<IEventAggregator, EventAggregator>(); containerRegistry.RegisterForNavigation<Tab1View, Tab1ViewModel>(); containerRegistry.RegisterForNavigation<ListStaticView, ListStaticViewModel>(); }
3. 定义视图和视图模型
Tab1View.xaml
<UserControl x:Class="YourNamespace.Tab1View" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:prism="http://prismlibrary.com/"> <Grid> <DataGrid ItemsSource="{Binding DataList}" SelectedItem="{Binding SelectedItem}"> <i:Interaction.Triggers> <i:EventTrigger EventName="SelectionChanged"> <prism:InvokeCommandAction Command="{Binding ItemSelectedCommand}" CommandParameter="{Binding SelectedItem, RelativeSource={RelativeSource AncestorType=DataGrid}}"/> </i:EventTrigger> </i:Interaction.Triggers> </DataGrid> </Grid> </UserControl>
Tab1ViewModel.cs
using Prism.Commands; using Prism.Mvvm; using Prism.Events; using System.Collections.ObjectModel; public class Tab1ViewModel : BindableBase { private readonly IEventAggregator _eventAggregator; private string _selectedItem; public ObservableCollection<string> DataList { get; private set; } public string SelectedItem { get { return _selectedItem; } set { SetProperty(ref _selectedItem, value); } } public DelegateCommand<string> ItemSelectedCommand { get; private set; } public Tab1ViewModel(IEventAggregator eventAggregator) { _eventAggregator = eventAggregator; DataList = new ObservableCollection<string> { "Item 1", "Item 2", "Item 3" }; ItemSelectedCommand = new DelegateCommand<string>(OnItemSelected); } private void OnItemSelected(string selectedItem) { if (selectedItem != null) { _eventAggregator.GetEvent<DataUpdateEvent>().Publish(selectedItem); } } }
ListStaticView.xaml
<UserControl x:Class="YourNamespace.ListStaticView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Grid> <TextBlock Text="{Binding UpdatedData}" /> </Grid> </UserControl>
ListStaticViewModel.cs
using Prism.Mvvm; using Prism.Events; public class ListStaticViewModel : BindableBase { private readonly IEventAggregator _eventAggregator; private string _updatedData; public string UpdatedData { get { return _updatedData; } set { SetProperty(ref _updatedData, value); } } public ListStaticViewModel(IEventAggregator eventAggregator) { _eventAggregator = eventAggregator; _eventAggregator.GetEvent<DataUpdateEvent>().Subscribe(OnDataUpdate); } private void OnDataUpdate(string updatedData) { UpdatedData = updatedData; } }
4. 定义主窗口布局
MainWindow.xaml
<Window x:Class="YourNamespace.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:prism="http://prismlibrary.com/"> <Grid> <TabControl Grid.Column="0"> <TabItem Header="患者列表" prism:RegionManager.RegionName="Tab1Region"/> <TabItem Header="到检列表" prism:RegionManager.RegionName="Tab2Region"/> <TabItem Header="WorkList" prism:RegionManager.RegionName="Tab3Region"/> </TabControl> <ContentControl Margin="300 0 0 0" prism:RegionManager.RegionName="ListStatic"/> </Grid> </Window>
5. 配置导航
确保在应用启动时正确导航到初始视图。
MainWindowViewModel.cs
using Prism.Mvvm; using Prism.Regions; public class MainWindowViewModel : BindableBase { private readonly IRegionManager _regionManager; public MainWindowViewModel(IRegionManager regionManager) { _regionManager = regionManager; _regionManager.RegisterViewWithRegion("Tab1Region", typeof(Tab1View)); _regionManager.RegisterViewWithRegion("ListStatic", typeof(ListStaticView)); } }
第二,使用共享服务
使用共享服务可以在视图之间共享数据,并在一个视图中更新数据时通知另一个视图进行更新。
1. 定义共享服务
public interface ISharedDataService { string SharedData { get; set; } event Action<string> DataChanged; void UpdateData(string data); } public class SharedDataService : ISharedDataService { private string _sharedData; public string SharedData { get => _sharedData; set { _sharedData = value; DataChanged?.Invoke(_sharedData); } } public event Action<string> DataChanged; public void UpdateData(string data) { SharedData = data; } }
2. 注册服务
在 App.xaml.cs
中注册服务。
protected override void RegisterTypes(IContainerRegistry containerRegistry) { containerRegistry.RegisterSingleton<ISharedDataService, SharedDataService>(); containerRegistry.RegisterForNavigation<Tab1View, Tab1ViewModel>(); containerRegistry.RegisterForNavigation<ListStaticView, ListStaticViewModel>(); }
3. 使用共享服务
Tab1ViewModel.cs
using Prism.Commands; using Prism.Mvvm; using System.Collections.ObjectModel; public class Tab1ViewModel : BindableBase { private readonly ISharedDataService _sharedDataService; private string _selectedItem; public ObservableCollection<string> DataList { get; private set; } public string SelectedItem { get { return _selectedItem; } set { SetProperty(ref _selectedItem, value); } } public DelegateCommand<string> ItemSelectedCommand { get; private set; } public Tab1ViewModel(ISharedDataService sharedDataService) { _sharedDataService = sharedDataService; DataList = new ObservableCollection<string> { "Item 1", "Item 2", "Item 3" }; ItemSelectedCommand = new DelegateCommand<string>(OnItemSelected); } private void OnItemSelected(string selectedItem) { if (selectedItem != null) { _sharedDataService.UpdateData(selectedItem); } } }
ListStaticViewModel.cs
using Prism.Mvvm; public class ListStaticViewModel : BindableBase { private readonly ISharedDataService _sharedDataService; private string _updatedData; public string UpdatedData { get { return _updatedData; } set { SetProperty(ref _updatedData, value); } } public ListStaticViewModel(ISharedDataService sharedDataService) { _sharedDataService = sharedDataService; _sharedDataService.DataChanged += OnDataChanged; } private void OnDataChanged(string updatedData) { UpdatedData = updatedData; } }
以上两种方法都可以实现从 Tab1Region
中的列表数据同步更新到 ListStatic
区域。