WPF应用程序中的视图注入
本文关键字:视图 注入 应用程序 WPF | 更新日期: 2023-09-27 18:09:57
截至2015年,Prism是视图注入的唯一选择吗?我读到的很多关于棱镜的文章都是5年前的。在我投入学习这个框架之前,我想考虑一下我所有的选择。就视图注入而言,有什么可以与Prism相比的吗?
MVVM灯更…轻便,使用方便。对于动态注入,它只是源上的触发器(用于在modelview中加载对象)和目的地控件上的raiseProperty。
<DataGrid Grid.Column="0" Grid.Row="0" x:Name="dgMain" AutoGenerateColumns="False" SelectionUnit="FullRow" ItemsSource="{Binding Users.items}"
CanUserReorderColumns="True" CanUserResizeColumns="True" CanUserResizeRows="False" CanUserSortColumns="True" CanUserAddRows="False"
LoadingRow="dgMain_LoadingRow" AlternatingRowBackground="#FFEEEEEE" >
<!--DataGrid.DataContext><Binding Source="{StaticResource tblUsers}"/></DataGrid.DataContext-->
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<mvvm:EventToCommand Command="{Binding SendUserCommand, Mode=OneWay}" CommandParameter="{Binding ElementName=dgMain, Path=SelectedItem}"></mvvm:EventToCommand>
</i:EventTrigger>
</i:Interaction.Triggers>
在我的例子中,我使用信使
void SendUserInfo(tblUser obj) {
if (obj != null) {
Messenger.Default.Send<MessageCommunicator>(new MessageCommunicator() { Emp = obj, LeMode=mode.Emp });
}
}
void ReceiveInfo() {
Messenger.Default.Register<MessageCommunicator>(this, (obj) => {
if (obj.LeMode == mode.Emp) {
this.UsrInfo = obj.Emp; // Stocke l'objet.
CloneUser(); // Mémorise pour l'éventuel Undo.
} else if (obj.LeMode == mode.Grp) {
this.GrpInfo = obj.Grp;
CloneGrp();
}
leMode = Mode.Edit;
});
}
首先,你不需要任何框架来做视图注入。棱镜计划只是其中一个例子。就我个人而言,我喜欢棱镜。mvvm,但我会避免棱镜。这对学习模式和实践很有好处。
我将首先描述另一种称为视图模型的方法:
它被称为viewmodel first,因为viewmodel总是首先创建,然后根据命名约定或任何逻辑选择视图。
不是将部分视图注入到shell视图中,而是将部分视图模型注入到shell视图模型中,然后在需要时为被注入的视图模型创建部分视图。
示例场景:
假设我有一个带有tab控件的主窗口,我想注入tab。
在shell视图模型中,我定义了标签集合(它们的视图模型),它将包含注入的标签。
public class MainWindowViewModel
{
public MainWindowViewModel()
{
Tabs = new ObservableCollection<ITab>();
}
public ObservableCollection<ITab> Tabs { get; private set; }
}
public interface ITab
{
string Header { get; }
}
在主窗口。我使用从viewmodel
创建视图的转换器显示它们 <TabControl ItemsSource="{Binding Tabs}">
<TabControl.ItemContainerStyle>
<Style TargetType="TabItem">
<Setter Property="Header" Value="{Binding Header}" />
</Style>
</TabControl.ItemContainerStyle>
<TabControl.ItemTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding Converter={StaticResource ViewModelToViewConverter}}"/>
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
ViewModelToViewConverter的例子可以在这里找到:https://stackoverflow.com/a/31721236/475727
现在唯一要做的就是将制表符注入制表符集合中。例如,将集合传递给模块,模块将注入制表符。
作为注入的另一种选择,您可以使用discovery。您只需发现实现ITab接口的所有类,实例化它们并添加到Tabs集合中。
优势:
- 你不必像使用RegionManager from prism时那样处理字符串。 你可以很容易地测试视图模型,包括shellviewmodel
- 你不依赖于任何框架