WPF应用程序中的视图注入

本文关键字:视图 注入 应用程序 WPF | 更新日期: 2023-09-27 18:09:57

截至2015年,Prism是视图注入的唯一选择吗?我读到的很多关于棱镜的文章都是5年前的。在我投入学习这个框架之前,我想考虑一下我所有的选择。就视图注入而言,有什么可以与Prism相比的吗?

WPF应用程序中的视图注入

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
  • 你不依赖于任何框架