Tag: prism

棱镜4 – 局部范围的RegionManager

我有使用PRISM 4的silverlight 4应用程序,我正在使用MEF。 我的Shell定义了一个加载模块的主要区域,我希望模块有自己的RegionManager,因此它们定义的区域是本地RegionManager而不是global的位置。 并且我希望在模块内部通过容器(对于类型IRegionManager)解析此本地RegionManager。 但是来自文档的方法: IRegion detailsRegion = this.regionManager.Regions[“DetailsRegion”]; View view = new View(); bool createRegionManagerScope = true; IRegionManager detailsRegionManager = detailsRegion.Add(view, null, createRegionManagerScope); 对我来说不起作用,当从子视图中解析IRegionManager时,我仍然得到GlobalRegionManager。

带有棱镜区域适配器的AvalonDock

我已经看到了一些关于SO的问题,但它们似乎都不适用于我。 我希望能够使用带有棱镜4的伟大的Avalondock 2.0 。然而,所有的样本区域适配器都适用于Avalondock 1.x系列,我无法使其正常工作。 有没有人有关于如何为AvalonDock的LayoutDocumentPane和LayoutAnchorablePane创建Region Adapter的示例代码?

如何使用异步方法对ViewModel进行unit testing。

我不知道从哪里开始,但让我简要介绍一下我在哪里以及我想要实现的目标。 我对MVVM上的unit testing很陌生,并且很难测试我使用PRISM委托命令属性公开的命令。 我的委托命令调用必须等待的异步方法,以便我可以获得实际结果。 下面是一个asyc方法,由我想测试的方法调用。 async void GetTasksAsync() { this.SimpleTasks.Clear(); Func<IList> taskAction = () => { var result = this.dataService.GetTasks(); if (token.IsCancellationRequested) return null; return result; }; IsBusyTreeView = true; Task<IList> getTasksTask = Task<IList>.Factory.StartNew(taskAction, token); var l = await getTasksTask; // waits for getTasksTask if (l != null) { foreach (ISimpleTask t in l) { […]

将棱镜与Ninject一起使用

是否有人在那里使用Prism框架与Ninject而不是Unity? 我需要一些Unity尚未支持的function,我决定将IoC容器切换到Ninject。 虽然我在替换中有点挣扎。 我需要从Prism使用的是EventAggregator和RegionManager。 我已经看到了这个实际上替换的示例 ,但是这是为较旧版本的Prism编写的,并且几个类似乎已经改变等等。所以我在尝试重写它之后做了一些努力后最终都感到困惑。 所以 – 我的问题基本上是: 如何用Ninject替换Unity? 有什么必要的步骤? 最初我假设我可以编写一个简单的引导程序来创建和配置Ninject容器并使用它来解析所有其他对象。 我将IEventAggregator绑定到EventAggregator并将IRegionManager绑定到RegionManager,但是在创建Shell并且调用RegionManager.CreateRegion时它会失败。 问题是,似乎我需要在某处设置ServiceLocator,因为它在此行上失败: IServiceLocator locator = ServiceLocator.Current; 一路上有什么想法和提示吗?

Prism,将Views和ViewModels与Unity连接,试图理解它

使用Unity创建视图和视图模型 使用Unity作为dependency injection容器类似于使用MEF,并且支持基于属性和基于构造函数的注入。 主要区别在于通常不会在运行时隐式发现类型; 相反,他们必须在容器中注册。 通常,您在视图模型上定义接口,以便视图模型的特定具体类型可以与视图分离。 例如,视图可以通过构造函数参数定义其对视图模型的依赖性,如此处所示。 C# public QuestionnaireView() { InitializeComponent(); } public QuestionnaireView(QuestionnaireViewModel viewModel) : this() { this.DataContext = viewModel; } 默认的无参数构造函数是允许视图在设计时工具(如Visual Studio和Expression Blend)中工作所必需的。 或者,您可以在视图上定义只写视图模型属性,如此处所示。 Unity将实例化所需的视图模型,并在实例化视图后调用属性setter。 C# public QuestionnaireView() { InitializeComponent(); } [Dependency] public QuestionnaireViewModel ViewModel { set { this.DataContext = value; } } 视图模型类型已在Unity容器中注册,如此处所示。 C# IUnityContainer container; container.RegisterType(); 然后可以通过容器实例化视图,如此处所示。 C# IUnityContainer container; […]

MVVM中的Silverlight热键命令?

我正在尝试基于Silverlight中的击键来触发命令。 据我了解,您无法在Silverlight中使用AccessKey或AcceleratorKey。 它看起来可能是有用的附加属性InputBindings也不起作用。 我开始在其他地方寻找。 看起来Prism是让Silverlight中的命令工作的方式,所以我检查了一下。 但是它们只有一个Click处理程序,它甚至不是设置关键命令的有用起点。 我只是错过了Prism的某些部分吗? 或者有一个很好的标准方法来处理MVVM Silverlight的热键?

两个.Net应用程序之间的高效通信

我目前正在c#中编写一个.Net应用程序,它有两个主要组件: DataGenerator – 一个生成大量数据的组件 Viewer – 一个WPF应用程序,能够可视化生成器创建的数据 这两个组件目前是我的解决方案中的两个独立项目。 此外,我正在使用PRISM 4.0框架,以便从这些组件中创建模块。 实质上,DataGenerator使用PRISM的EventAggregator生成大量数据并发送事件,Viewer会订阅这些事件并显示为用户准备的数据。 现在我的要求略有改变,现在两个组件将在他们自己的应用程序中运行(但在同一台计算机上)。 我仍然希望所有的通信事件驱动,我还想使用PRISM框架。 我的第一个想法是使用WCF进行这两个应用程序之间的通信。 然而,有一件事让生活变得更加艰难: DataGenerator完全不了解 Viewer( 也没有依赖关系 ) 如果我们没有打开查看器,或者我们关闭查看器应用程序,DataGenerator应该仍然可以正常工作。 当前很多事件都是从DataGenerator上升的(使用EventAggregator):WCF是否足够高效,可以在很短的时间内处理大量事件? 基本上所有这些事件所携带的数据都是非常简单的字符串,整数和布尔值。 如果没有WCF,可以采用更轻量级的方式吗? 最后,如果DataGenerator可以发送这些事件并且可能有多个应用程序订阅它们(或者没有),那将是很好的。 任何建议和提示都非常感谢。 谢谢! 基督教 编辑1 我现在正在创建两个简单的控制台应用程序(一个托管服务并发送消息,另一个接收消息)使用WCF和回调(如建议的那样)。 一旦我开始工作,我将添加工作代码。 编辑2 好的 – 管理一个简单的程序运行! :)谢谢你的帮助,伙计们! 以下是代码和图片的位置: 让我们从发件人开始: 在我的应用程序中,发件人包含服务接口及其实现。 IMessageCallback是回调接口: namespace WCFSender { interface IMessageCallback { [OperationContract(IsOneWay = true)] void OnMessageAdded(string message, DateTime timestamp); } } […]

WPF Prism – 在哪里放资源?

我有一个棱镜应用程序和各种模块。 我想知道找到资源的最佳位置在哪里,例如样式,画笔,控制模板,数据模板? 我应该制作一个单一的资源字典并将所有内容放在那里 每个模块应该有自己的资源吗? 或者每个视图? 我想遵循Prism的目标,保持一切模块化,但我也没有看到在每个模块中重新声明相同资源的重点……

在List / ObservableCollection中维护集合

我已成功添加一个项目列在MVVM中,现在我的问题是维护视图模型中的列表。 每次我导航到页面或返回页面并返回到列表视图时,列表都会重置。 我将如何实现这一目标? 我目前正在使用棱镜来构建MVVM。 ViewModel: public ObservableCollection _cartData; public ObservableCollection CartData { get { return _cartData; } set { SetProperty(ref _cartData, value); } } private DelegateCommand _addItemCommand; public ICommand AddItemCommand { get { if (_addItemCommand == null) { _addItemCommand = new DelegateCommand(AddToCart); } return _addItemCommand; } } public void AddToCart() { CartData.Add(new CartData { Cakename […]

Prism – EventAggregator.GetEvent 。订阅() – 使用generics和约束

我有一个问题订阅事件Aggregator事件作为prism框架的一部分。 如果我使用像 eventAggregator.GetEvent().Subscribe(MyMethod) 然后一切正常,我的方法在事件发布时触发。 但是,当移动到除I string之外的更复杂的对象时,我遇到了问题。 我有一堆类,它们都来自一个接口(IRequest),例如 我的事件类设置如下 public class MyEvent : PubSubEvent<MyClass> where TRequest : IRequest {} 我有一个generics类(MyClass)在其中使用IRequest的对象 – 再次,在这一点上似乎一切正常。 现在,假设我发布了一个使用其中的对象Profile的MyClass事件: eventAggregator.GetEvent<MyEvent>().Publish(myProfileObject); 在我的订阅中,我想要一个可以捕获MyEvent的所有事件的方法 – 与T是Profile还是从IRequest派生的其他对象无关 – 这是我似乎遇到问题的地方。 在下面的例子中,第一个工作,但第二个没有 – 我理想的是喜欢使用类似于第二个的东西。 eventAggregator.GetEvent<MyEvent>().Subscribe(test1); void test1 (MyClass obj) { //Some stuff here } eventAggregator.GetEvent<MyEvent>().Subscribe(test2); void test2(MyClass obj) where T : IRequest { //never gets called } 我的假设是因为Profile来自IRequest然后它应该工作??? […]