WPF MVVM : How to load views "on demand" without using plug-in architecture?

标签 wpf mvvm

我有一个类似于 Outlook 的 WPF UI,左侧有导航,顶部有一个工具栏,底部有一个状态栏,所有这些都在 DockPanel 中。 .
应用程序的“主要”区域位于 DataGrid 内。这是 LastChild,因此填充了剩余空间,它目前看起来像这样:

<Grid DockPanel.Dock="Right">
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition />
    </Grid.RowDefinitions>
    <views:View1 Grid.Column="0" Grid.Row="0"/>
    <views:View2 Grid.Column="0" Grid.Row="0"/>
    <views:View3 Grid.Column="0" Grid.Row="0"/>
    <views:View4 Grid.Column="0" Grid.Row="0"/>
</Grid>
这些 View 都是拥有自己的 ViewModel 的用户控件,Visibility属性绑定(bind)到其 ViewModel 中的属性并由导航 Pane 选择控制。 When a navigation pane item is selected the main ViewModel sends a message to ViewModels of the views and upon receiving the message the ViewModels of the views set their Visibility相应的属性...
现在,这工作正常,但感觉不对,因为这些 View 的所有 ViewModel 都是在应用程序启动时实例化的,而不是在选择相关导航 Pane 时提出有关性能和内存使用的问题......
My question is if there is a way of loading each view and its ViewModel "on demand", when the related navigation pane is selected and unloading these views and ViewModels when a different navigation pane is selected without resorting to PRISM/MEF or some other plugin架构...而且,更一般地说,您将如何使用“嵌入”主视图中的多个 View / View 模型来构建这样的应用程序?

最佳答案

这就是我所做的:

首先,在您的主 ViewModel(服务于主窗口的那个)上,添加一个 Content 属性:

object _content;
public object Content
{
    get { return _content; }
    set
    {
        _content = value;
        RaisePropertyChanged("Content");
    }
}

当用户从一个 View 切换到另一个 View 时,设置 Content属性添加到他们选择的 View 的适当 ViewModel。

然后,在主窗口中,您可以使用 ContentControl 显示当前的 Content ViewModel:
<ContentControl Content="{Binding Content}" />

...在此之上,为 Content 的各种 ViewModel 中的每一个定义一个 DataTemplate可能设置为:
<DataTemplate DataType="{x:Type vm:FooViewModel}">
    <my:FooUserControl />
</DataTemplate>

<DataTemplate DataType="{x:Type vm:BarViewModel}">
    <my:BarUserControl />
</DataTemplate>

因此,现在 ContentControl 将负责初始化和显示您的每个用户控件,具体取决于哪个 ViewModel 当前处于“事件状态”。

关于WPF MVVM : How to load views "on demand" without using plug-in architecture?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6810799/

相关文章:

wpf - 停止 Gridsplitter 将内容拉伸(stretch)到窗口之外

c# - WPF、PRISM 和事件聚合器

wpf - ObservableCollection 作为 DependencyProperty

c# - WPF中的配对的ToggleButtons

silverlight - 带传感器的Windows Phone mvvm

c# - WPF 绑定(bind)到特定属性

design-patterns - 使用MVVM时,是否应该创建新的 View 模型以不同方式显示同一模型?

c# - WPF,为什么我的绑定(bind)只从 MainWindow 更新?

c# - 将数据从 WCF 绑定(bind)到 MVVM 客户端始终为空

javascript - 在 MV* 设计模式中,模型是单个数据单元还是与数据一起工作的所有逻辑?