Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight MVVM MEF视图注入_Silverlight_Mvvm_Mef - Fatal编程技术网

Silverlight MVVM MEF视图注入

Silverlight MVVM MEF视图注入,silverlight,mvvm,mef,Silverlight,Mvvm,Mef,因为我的标题是符合流行语的,我希望我能得到很多问题的答案或任何指向正确方向的指针 好的,我通常做的是有一个ViewModel,其中包含ViewModels本身的列表 public class MasterViewModel { public ObservableCollection<DetailViewModel> DetailViewModels { get; set; } public DetailViewModel Detail { get; set; } }

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

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

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>
我实现了一个自定义导出

[ExportGadget(GadgetType = GadgetTypes.News)]
我有我的NewsGadgetView.xaml(它实现了IGadget)并导入NewsGadgetViewModel,还将其本身作为ExportGadget提供

到目前为止还不错。有了这个,我可以创建一组小工具

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

现在我迷路了

我想到了一个类似GadgetFactory的东西,它使用PartCreator来创建我的小工具。 但这会出现在我的SidebarView.xaml中 但我想控制我的小工具,以便在侧边栏中添加和删除它们。 所以我想到了一些类似于观察收集的东西

这是我的义务

GadgetHost是基本网格,它将动态加载Gadget

那么,在不知道哪些小工具可用的情况下,如何创建包含不同小工具的侧边栏,并为侧边栏以及每个小工具创建一个ViewModel呢


感谢您的帮助……

这就是托管扩展性框架的威力所在。我基本上有一个现有的项目相同的挑战

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

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

管理器使用惰性导入集合处理导入。它只是将它们分配给一个字典,这样我们就可以将视图枚举映射到视图实例,然后将区域枚举映射到区域实例

然后,route表等待激活视图的请求(加载时可能会发生这种情况),并找到从视图到区域的路由,然后将其插入

视图模型呢

对于“全局”信息,我使用导出的合同,如下所示:

[Export(typeof(IMasterViewModel))]
public class MasterViewModel 
{
}
这是每个插件可能需要的东西。然后我有一个基本视图模型,“子”视图模型继承自:

public class BaseViewModel 
{
   [Import(typeof(IMasterViewModel))]
   public MasterViewModel MasterVM { get; set; }
}
现在让我们假设我有一个完全独立的XAP。我需要参考一些“通用”接口。所以我不是引用全局视图模型的实例,只是引用契约。但是,在我的插件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; 
    }
}
将视图模型导入视图时,它还将导入主视图模型,从而提供对这些其他零件的访问。如果需要在视图模型可用时触发某些操作,只需实现iPartimportsAssetFiedNotification,即可在准备就绪时触发

[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; 
    }
}