基本上我在我的MainViewModel.cs中:
ObservableCollection<TabItem> MyTabs { get; private set; }
Run Code Online (Sandbox Code Playgroud)
但是,我需要以某种方式不仅能够创建选项卡,而且还可以在维护MVVM的同时加载选项卡内容并将其链接到适当的视图模型.
基本上,我如何将用户控件作为tabitem的内容加载并将该usercontrol连接到适当的viewmodel.使这个困难的部分是ViewModel不应该构造实际的视图项,对吧?或者可以吗?
基本上,这将是MVVM合适的:
UserControl address = new AddressControl();
NotificationObject vm = new AddressViewModel();
address.DataContext = vm;
MyTabs[0] = new TabItem()
{
Content = address;
}
Run Code Online (Sandbox Code Playgroud)
我只是问,因为我正在ViewModel中构建一个View(AddressControl),这对我来说听起来像MVVM禁忌.
我下载了Prism v4并运行了安装程序.我进入目录并运行以下两个批处理文件:
当我编译这些应用程序时,我没有看到任何真正的区别.我已经搜索了MEF vs Unity,我发现了一些优点/缺点,但没有任何具体说明是否一个人在Prism中使用"更好"(我知道这是主观的).我想也许如果我列出我的要求,有人可以指出我使用的正确技术(即使它不是Prism 4).
例如:
基本用户可能有以下选项:
所有相关地址都在Address.dll内.
高级用户可能具有以下选项:
所有相关地址都在Address.dll内.
管理相关的所有项目都在Admin.dll中.
应用程序不应该实际引用这些DLL中的任何一个,我打算反映它们,以便如果有100个不同的模块,并且用户只能访问其中的2个,则只下载和使用其中的2个.有权访问其中10个的用户获得10个用户.
我已经通过WebService解决了下载DLL.:)
我在用什么:
我想弄清楚的是如何在维护MVVM模式的同时开始使用Prism + MEF.当我进入Prism Quickstarts时,它有一个Prism + MEF,但项目中的注释明确指出Quickstart示例没有实现MVVM.我不确定要混合/匹配什么,以便我的shell本身遵循MVVM(和区域).
基本上,我想使用MEF能够在运行时加载程序集(模块).而且,我想在我的Shell中设置区域并让Shell使用MVVM(因此我可以将数据绑定到shell).网上的每个例子都是Prism,Prism + MVVM,Prism + Unity,Silverlight示例,Prism + MEF等.但我找不到任何WPF Prism + MEF + MVVM示例或信息.我真的不知道如何设置我的bootstrapping,以便开始.
一旦完成该部分,我确定我将弄清楚如何使用MVVM将其他控件加载到我的shell中.任何帮助都会很棒,特别是那些直接处理这种情况的资源就像是类似的东西(即Prism + Unity和没有MEF).谢谢!
我正在构建一个演示应用程序来学习Prism 4的导航功能.该应用程序有两个模块 - 每个模块有三个视图:
Shell有三个命名区域:"RibbonRegion","TaskButtonRegion"和"WorkspaceRegion".视图加载到这些区域.为了测试基本设置,我使用Prism Region Manager注册了所有三个视图,以便它们在启动时加载,并且所有操作都按预期工作.
接下来,我修改了设置,以便在启动时只加载任务按钮.其他视图将仅在请求时加载,方法是单击任务按钮.我的模块初始化器看起来像这样:
public void Initialize()
{
/* We register the Task Button with the Prism Task Button Region because we want it
* to be displayed immediately when the module is loaded, and for the lifetime of
* the application. */
// Register Task Button with Prism Region
m_RegionManager.RegisterViewWithRegion("TaskButtonRegion", typeof(ModuleATaskButton));
/* We register these objects with the Unity container because we don't want them
* instantiated until we navigate to …Run Code Online (Sandbox Code Playgroud) 我正在尝试引用MergedDictionaries.SharedStyles项目,该项目具有必须使用全部应用程序的所有样式.所以这里我在不同的文件夹下有不同的样式作为资源字典.所以最后我将它们合并到AllSharedStyles.xaml中,并在Styles项目级别进行.
现在我在Solution level <>中有另一个ResourceDictionary,它引用了AllSharedStyles.xaml资源字典<< >>.此ResourceDictionary作为链接添加到解决方案中的所有模块.
这里的问题是在我的SharedResourceDictionary中我有以下MergedDictionaries
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/MergedDictionaries.SharedStyles;component/AllSharedStyles.xaml" />
<ResourceDictionary Source="/View/LocalResource.xaml" />
</ResourceDictionary.MergedDictionaries>
Run Code Online (Sandbox Code Playgroud)

我首先提到公共资源然后我的本地,以便覆盖(仅在需要时)任何特定于模块的样式.
现在,当我运行应用程序时,它会抱怨
'Set property 'System.Windows.ResourceDictionary.Source' threw an exception.' Line number '5' and line position '10'.
Run Code Online (Sandbox Code Playgroud)
那是错误信息.
根据我的理解,它正在寻找适当的参考.我也尝试使用Pack URL ref:Pack URLss.这是包网址:
<ResourceDictionary Source="pack://application:,,,/MergedResourceDictionaries.Styles;component/component/AllSharedStyles.xaml" />
Run Code Online (Sandbox Code Playgroud)
所以关于如何在这里有相对路径的任何建议????
抱歉,我的描述/问题投射
我只是想知道地区的意义.我想我不明白他们解决的问题.
例如,我看到很多人使用区域作为导航区域,但是为什么不只是将ItemsControl绑定到ObservableCollection而不是具有区域并将不同的导航元素加载到该区域?
一个现实世界的例子,它的使用/好处超过替代品将摇滚!
我正在从Prism 2.1转换为Prism 4,我需要为Log4Net编写一个ILoggerFacade类.我从Prism 2.1获取的旧代码不再有效.有没有人有他们愿意分享的ILoggerFacade类的示例代码?谢谢你的帮助.
免责声明:Prism新手.我正疯狂地阅读,以弥补失去的时间虽然:)
上下文:我需要为使用Prism构建的WPF应用程序编写自动验收测试.
问题:我发现在没有UI的情况下尝试编写支持ViewModels以及他们需要的所有内容是令人费解的.
我可能在这里错了... Prism允许你用命名占位符(区域)标记shell.不同的模块(独立单元)使用相应的RegionNames注册其视图.视图还依赖于通过MEF/Unity注入的ViewModel(ctor注入).
因此,编写应用程序将委托给Prism(或更重要的是View).这似乎是一种视图优先的方法.这样可以在没有用户界面的情况下启动应用程序.使用UI进行测试是一件痛苦的事.
我正在寻找的是一个演示者第一种方法,它在没有UI的情况下组成整个对象(ViewModel和依赖关系)图.
var viewModel = Someone.ComposeAndGet<ShellViewModel>();
Run Code Online (Sandbox Code Playgroud)
是否可以通过不同的方式编写应用程序或不支持Prism4?
[更新:2011年12月]
http://compositewpf.codeplex.com/discussions/283065
发布在棱镜论坛上以获得更多亮点; 似乎不可能.建议使用UI测试进行验收测试.Prism组成UI; 因此对观点有着至关重要的依赖性.
我们正在构建一个WPF Prism应用程序.我们有不同的开发人员在不同的模块项目上工作,并且多个模块被注入主Application Shell.主要应用程序也是一个单独的项目.我们还希望能够在不同的应用程序中使用这些模块.我们不希望在每个应用程序中命名具有相同名称的区域.
例如,假设我们有一个模块可用于两个不同的应用程序.在一个应用程序中,其开发人员可以将模块的区域命名为"DetailsRegion",而在另一个应用程序中,其开发人员可将其命名为"ResultsRegion".
我能找到的每个例子都通过硬编码模块类定义中的区域名称来注册View with the Region :
myRegionManager.RegisterViewWithRegion("RegionNameHere", GetType(ModuleViewType))
Run Code Online (Sandbox Code Playgroud)
我想要做的是将Region名称放在主应用程序的app.config文件中,并将此名称传递给模块.像这样的东西:
在主Shell应用程序的app.config中:
<Modules>
<SearchModule>
<add key="RegionName" value="SearchRegion" />
</SearchModule>
</Modules>
Run Code Online (Sandbox Code Playgroud)
在模块的类文件中:
Dim settings As NameValueCollection = CType(ConfigurationManager.GetSection("Modules/SearchModule"), NameValueCollection)
Dim regionName as string = settings("RegionName")
myRegionManager.RegisterViewWithRegion(regionName, GetType(SearchModuleType)
Run Code Online (Sandbox Code Playgroud)
在某种程度上,这将是完全将模块与shell和彼此分离的最后一步.
这在模块的视图中完美地工作.但我无法在模块的类定义文件中执行此操作,因为ConfigurationManager在该级别不可用.
我可以通过将区域名称放在模块的 app.config 的ApplicatonSettings部分来完成此操作.但这违背了能够将模块存储在一个位置以便由多个应用程序加载的目的.它确实需要在主应用程序的 app.config中.
有没有办法用区域注册模块的视图,而无需在代码中硬编码区域的名称?我们努力不要硬编码任何东西.这真的有必要吗?
我正在运行最新的PRISM 4.2.不幸的是,文档中的Event Aggregator教程是通过Unity而不是MEF驱动的.我不能让它在MEF下运行.
App.xaml.cs
public partial class App : Application
{
[Import]
public IEventAggregator eventAggregator;
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
Bootstrapper bootstrapper = new Bootstrapper();
bootstrapper.Run();
}
}
Run Code Online (Sandbox Code Playgroud)
Bootstrapper.cs
public class Bootstrapper : MefBootstrapper
{
protected override DependencyObject CreateShell()
{
return new MainWindow();
}
protected override void InitializeShell()
{
base.InitializeShell();
App.Current.MainWindow = (Window)Shell;
App.Current.MainWindow.Show();
}
protected override void ConfigureAggregateCatalog()
{
base.ConfigureAggregateCatalog();
AggregateCatalog.Catalogs.Add(new AssemblyCatalog(this.GetType().Assembly));
}
protected override IModuleCatalog CreateModuleCatalog()
{
ModuleCatalog moduleCatalog = new ModuleCatalog();
return moduleCatalog;
}
} …Run Code Online (Sandbox Code Playgroud)