【问题标题】:How can I implement "View Model First" using Prism and Unity?如何使用 Prism 和 Unity 实现“查看模型优先”?
【发布时间】:2016-04-28 04:01:13
【问题描述】:

澄清 我正在使用 MVVM 解决方案。我在 ViewModels 和 Views 之间有一个 1 对 1 的映射。我见过的所有解决方案都遵循视图优先的方法,其中视图类型由 IoC 容器解析,并具有 ViewModel 作为依赖项。我需要以某种方式扭转这种情况。

原帖:

我目前正在尝试将一个简单的数据库查看应用程序从 Caliburn Micro 重构为 Prism(我对它非常陌生)。该应用程序当前使用 ViewModel-First 方法,并且 ShellViewModel 维护绑定到 TabControl 的 ViewModel 列表。 我找不到如何在 Prism 中实现类似的方法。我见过的所有解决方案都使用视图优先方法,但我有多个状态都映射到一种类型的视图,并且需要将这些状态分开。

有没有一种方法可以配置 prism 以在将视图模型分配给区域时自动注入视图?

谢谢。

【问题讨论】:

  • 我认为您正在寻找使用隐式 DataTemplate。这只是在 XAML 中定义的带有 TargetType 但没有 Key 的 DataTemplate。当在可视树中遇到指定对象时,WPF 将自动使用该 DataTemplate 来绘制指定对象,例如当它尝试呈现一个 TabControl 时,其中 ItemsSource 设置为 ViewModels 的集合。如果需要,请参阅 here 以获取示例。

标签: c# mvvm unity-container prism caliburn.micro


【解决方案1】:

Rachel 在她对原始问题的评论中向我指出了一个解决方案。 我没有尝试实现特殊的棱镜功能和棱镜区域,而是使用 DataTemplates 进行了更直接的 MVVM 实现。

ViewModel 大纲:

public abstract class ContainerViewModel : BindableBase
{
    public ObservableCollection<ItemViewModel> Items { get; set; }
    public ItemViewModel ActiveItem { get; set; }

    protected virtual void Add(ItemViewModel item) { ... }
    protected virtual void Remove(ItemViewModel item) { ... }
    protected virtual void Activate(ItemViewModel item) { ... }
}

还有 XAML:

<TabControl Grid.Column="1" ItemsSource="{Binding Items}" SelectedItem="{Binding ActiveItem}">
                <TabControl.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Table.TableName}"    />
                    </DataTemplate>
                </TabControl.ItemTemplate>
                <TabControl.ContentTemplate>
                    <DataTemplate DataType="{x:Type viewModels:QueryViewModel}">
                        <local:QueryView />
                    </DataTemplate>
                </TabControl.ContentTemplate>
            </TabControl>

【讨论】:

    【解决方案2】:

    看看这篇代码项目文章(忽略关于子容器的部分):http://www.codeproject.com/Articles/640573/ViewModel-st-Child-Container-PRISM-Navigation

    【讨论】:

    • 这篇文章内容丰富,但似乎没有遵循 MVVM(演示解决方案实际上根本不包含任何视图),并在底部声明它是 WPF/Silverlight 应用程序的利基解决方案。我会看看如何澄清我的问题。
    猜你喜欢
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 2017-04-11
    • 2011-09-18
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多