Silverlight MVVM MEF ViewInjection

标签 silverlight mvvm mef

因为我的标题符合流行语,我希望我能得到很多关于我的问题的答案或任何指向正确方向的指示。

好的,我通常做的是有一个 ViewModel,其中包含 ViewModel 本身的列表。

public class MasterViewModel
{
    public ObservableCollection<DetailViewModel> DetailViewModels { get; set; }
    public DetailViewModel Detail { get; set; }
}

   <ItemsControl ItemsSource="{Binding DetailViewModels}">
        <ItemsControl>
            <ItemsPanelTemplate>
                <StackPanel />
            </ItemsPanelTemplate>
        </ItemsControl>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <views:DetailsView />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

考虑到这一点,我现在来回答我的问题。我阅读了很多关于 MEF 的好东西,还看到了 Glenn Block 的仪表板示例,但这对我的帮助还不够。

我想要做的是 sidbar (如 windows 侧边栏)。
侧边栏 = StackPanel
ListItems = 小工具

但我想要它 MVVM 风格

好的,我有类似契约(Contract)的东西
IGadget

我实现了一个自定义导出。
[ExportGadget(GadgetType = GadgetTypes.News)]

我有我的 NewsGadgetView.xaml(它实现了 IGadget)并导入了 NewsGadgetViewModel 并使其自身可用作 ExportGadget。

到目前为止,一切都很好。有了这个,我可以创建一组小工具。

然后我有我的 SidbarView.xaml,它导入了一个 sidebarViewModel。

现在我迷路了……

我想到了类似 GadgetFactory 的东西,它使用 PartCreator 来创建我的小工具。
但这将位于我的 SidebarView.xaml
但我想控制我的小工具,以便从我的侧边栏中添加和删除它们。
所以我想到了像 ObserveableCollection 这样的东西......

我绑定(bind)到哪个













GadgetHost 基本上是网格,它将动态加载小工具....

那么如何在不知道哪些小工具可用的情况下创建包含不同小工具的侧边栏并为侧边栏和每个小工具提供 ViewModel?...

谢谢你的帮助....

最佳答案

这就是托管可扩展性框架的强大之处。我在现有项目中基本上面临同样的挑战。

我的解决方案是抽象 View 和区域,然后使用路由机制。

基本上,有一个区域的自定义导出,我导出一个 FrameworkElement(可能是 StackPanel、Grid 等), View 有一组属性,这些属性导出为 UserControl。

管理器使用惰性导入集合处理导入。它只是将这些分配给字典,因此我们将 View 枚举映射到 View 实例,然后将区域枚举映射到区域实例。

然后路由表等待激活 View 的请求(这可能在加载时发生),并找到从 View 到区域的路由,然后将其插入。

View 模型呢?

对于“全局”信息,我使用的是导出的契约(Contract),如下所示:

[Export(typeof(IMasterViewModel))]
public class MasterViewModel 
{
}

这有每个插件可能需要的东西。然后我有一个“子” View 模型继承自的基本 View 模型:
public class BaseViewModel 
{
   [Import(typeof(IMasterViewModel))]
   public MasterViewModel MasterVM { get; set; }
}

所以现在假设我有一个完全独立的 XAP。我需要引用一些“通用”接口(interface)。所以我没有引用全局 View 模型的实例,只是契约(Contract)。但是,在我的插件 XAP 中,我可以这样做:
[Export]
public class PluginViewModel : BaseViewModel 
{
   etc ... etc .. 
}

public partial class PluginControl : UserControl 
{
    [Import]
    public PluginViewModel 
    {
        get { return LayoutRoot.DataContext as PluginViewModel; }
        set { LayoutRoot.DataContext = value; 
    }
}

当 View 模型被导入 View 时,它也会导入主视图模型,提供对其他部分的访问。如果您需要在 View 模型可用时触发某些操作,只需实现 IPartImportsSatisfiedNotification 即可在准备好时触发。

关于Silverlight MVVM MEF ViewInjection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2381408/

相关文章:

c# - 如何从 Silverlight 5 中的自定义目录执行外部程序

c# - 从代码启动音乐应用程序

asp.net - MEF 和 ASP.NET MVC

c# - ASP.NET MVC2 和 MEF - 为什么我的 MefControllerFactory 无法获取导出或元数据?

c# - 将 MEF 与企业库一起使用

silverlight - 清除 MVVM ViewModel 中的数据网格

silverlight - 如何在 Silverlight Web 客户端上执行 Rx Observable

.net - 如何以一种方式将一个文本 block 值绑定(bind)到另一个文本 block 并在 MVVM 中获取值

c# - 在WinRT MVVM中无法执行按钮单击和组合框选择更改

c# - 如何在ViewModel中获取Button的内容?