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
区域。