Tag: prism

棱镜请求导航到新视图

我正在使用带有autofac WPF Prism 6 ,并且在视图之间导航时遇到问题。 我所拥有的是一种观点,我只想保持活着直到我离开它,下次我导航到它时,我想创建一个新版本的视图。 在加载时,我注册了一个具有以下代码的IModule _regionManager.RegisterViewWithRegion(RegionNames.MainRegion, typeof(DxfDisplay.Views.DxfDisplay)); 这会注册我的视图,系统在初始加载时工作,我在视图模型上实现了INavigationAware和IRegionMemberLifetime接口,并且public bool KeepAlive => false; 实现IRegionMemberLifetime以便在我完成时处理我的视图。 当我离开这个视图时,一切都很好,但当我尝试导航到使用导航到视图时 _regionManager.RequestNavigate(RegionNames.MainRegion, new Uri(“DxfDisplay”, UriKind.Relative), parameters); 视图未打开,并且未调用视图模型构造函数。 为了使导航正常工作,我需要再次注册该区域的视图。 或者,如果我将KeepAlive更改为true我可以导航回原始视图,但如果INavigationAware.IsNavigationTarget返回false,则无法生成新视图。 我的问题是如何向区域管理器注册视图,这样当我调用_regionManager.RequestNavigate ,它将创建一个新的视图实例并显示它。 我觉得我错过了简单的东西,只是忽略了它。

如何使用CallerMemberName属性更改ILoggerFacade实现以跟踪调用方法?

我正在尝试将记录function实现到我的新WPF 4.5 CompositeWPF(Prism)项目中。 这要求我在我的代码中实现ILoggerFacade。 接口只实现1种方法: Log(string message, Category category, Priority priority) 。 ILoggerFacade接口: public interface ILoggerFacade { void Log(string message, Category category, Priority priority); } 我的实施: public class Log4NetLogger : ILoggerFacade { private static readonly ILog m_Logger = LogManager.GetLogger(typeof(ILoggerFacade)); public void Log(string message, Category category, Priority priority) { switch (category) { case Category.Debug: m_Logger.Debug(message); break; […]

使用带有Prism / Unity的Silverlight MVVM,需要检测何时关闭视图

我正在使用MVVM(Model-View-ViewModel)模式编写应用程序,并利用Microsoft P&P团队的Prism和Unity位。 我有一个包含项目列表的视图。 这些项包含在ViewModel中的ObservableCollection中,View中的列表框是数据绑定的(ViewModel设置为View的DataContext)。 在ViewModel中,我有一个运行的计时器,每30秒触发一次服务器轮询以获取新数据。 当数据返回时,我将其封送到UI线程并将新数据添加到ObservableCollection。 一切都很好。 我遇到的问题是我需要在视图关闭时停止计时器。 我不确定在这里要注意什么事件。 Unity中有什么东西会告诉我该区域的视图何时被替换? 是否有一个最适合从视图中使用的事件,并且可能将该事件(或外观)传递给ModelView? 根据P&P示例,我的视图是一个UserControl。 我找不到“Unload”事件,也没有覆盖的方法。 我已经在考虑编写自己的服务来处理视图更改(RegionManager的某种外观),并且可能只是在我的Views上实现一个公共接口来进行清理,或者在从视图中删除它们时实现IDisposable。 但是,如果使用核心Silverlight框架或Unity / Prism的范围有一个干净的方法,我宁愿采取这种方式。 编辑 – 答案: 我最后选择了一个与我正在为我的解决方案做的最接近的答案来标记Anderson Imes的答案。 但实际上,我正在使用来自PL和GraemeF的部件,并且每个人都投票。 这对我来说是一个很好的回应,因为它让我对这些区域有了更好的了解,给了我另一个框架来查看,并validation我可能正在通过实现服务来处理视图更改而不仅仅是调用进入RegionManager。

‘不能分配给 – 只读’还有一个二传手吗?

我得到一个(对我而言)非常奇怪的参数exception。 当调用this.MainViewModel.MyObject = new MyObject(..some parameters here..); ,我得到property or indexer ‘IMainViewModel.MyObject’ cannot be assigned to — it is read only 。 我一直在努力寻找有类似问题的人,但每次答案都是“你有一个二传手吗?”。 是的,我确实有一个二传手。 是的,我的财产是公开的。 我很困惑为什么它在这里投入适合。 我想写的属性是; public Object MyObject { get { return this.myObject; } set { this.myObject = value; this.RaisePropertyChanged(); this.eventAggregator.GetEvent().Publish(this.MyObject); } } 我不知道我错过了哪些将MyObject属性限定为readonly ..?

将Shapes.Path项绑定到ItemsControl

我一直在试图弄清楚如何将ObservableCollection绑定到ItemsControl。 我有一个现有的项目,它严重依赖于后面的代码和canvas没有绑定,我试图更新以使用mvvm和prism。 ObservableCollection将填充许多Path项。 它们是由我使用的外部库生成的。 当我手动操作canvas本身时,库正常运行。 以下是ViewModel代码的片段: ObservableCollection _items; ObservableCollection Items { get { return _items; } set { _items = value; this.NotifyPropertyChanged(“Items”); } } public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(string propertyName) { if (this.PropertyChanged != null) { this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } 支持XAML 我遇到的问题是Path永远不会画画。 关于我哪里出错以及从哪里开始调试过程的任何建议?

MVVM WPF主细节combobox

感谢我之前在Stack Overflow上提出的一些建议,我在理解MVVM方面取得了很大的进步。 然而,当事情开始变得更加复杂时,我仍然在苦苦挣扎。 我在下面的视图是为了输入订单。 它绑定到OrderScreenViewModel的DataContext。 第一个combobox用于选择客户。 第二个combobox用于为新的OrderLine选择ProductCode。 有些项目我无法解决如何在MVVM中实现: 1)选择客户时更新Productscombobox,以便其项目源仅显示与combobox中选择的CustomerDto记录具有相同CustomerId的产品 2)当调用Load时,在Customerscombobox中设置SelectedItem,以便它显示CustomerId等于OrderDto上的CustomerId。 3)应用与1)相同的过程,以便只显示/加载属于该Customer的产品,并在Productscombobox上设置SelectedItem,使其指向与OrderLineDto中包含的ProductId相同的条目 我不知道如何继续,或者即使我的视图模型的责任是正确的。 也许它与NotifyPropertyChanged有关? 任何有关如何实现上述目标的指示将不胜感激。 我相信如果我做对了,它会对我的应用程序有很大帮助。 非常感谢Alex。 public class OrderScreenViewModel { public WMSOrderViewModel Order { get; private set; } public WMSOrderLineViewModel CurrentLine { get; private set; } public OrderScreenViewModel() { Order = new WMSOrderViewModel(); CurrentLine = new WMSOrderLineViewModel(new OrderLineDto()); } public void Load(int orderId) { var […]

如何使用Moq模拟ILogger / ILoggerService

我正在为View Model类编写一些unit testing。 该类的构造函数注入ILoggerService。 该接口定义了一个返回ILogger的方法GetLog。 类似下面的东西, 它代表一个实现ILoggable的类: – protected ViewModelBase(ILoggerService loggerService) { Logger = loggerService.GetLog(this); } 我正在尝试unit testing我的CreateNewOrder方法,如下所示: private void CreateNewOrder(INewOrderViewModel newOrderViewModel) { Logger.Log(“Sending Create New Order Message”, LogCategory.Info); var createNewOrderMessage = new OrderMessage(newOrderViewModel); _eventAggregator.GetEvent().Publish(createNewOrderMessage); } 我将如何模拟ILoggerService以便返回有效的Logger? 目前我的Unit测试抛出NullReferenceExeception。 我正在用Moq做我的嘲笑。 我想象我需要做一些事情 var loggerService = new Mock(); loggerService.Setup(svc => svc.GetLog(??)) 但是,如果不让我的测试类实现ILoggable,我无法看到。 提前致谢。

有两个键和一个对象的最佳C#集合是什么?

我有一个MenuManager类,每个模块可以添加一个键和要加载到主要内容中的元素: private Dictionary _mainContentItems = new Dictionary(); public Dictionary MainContentItems { get { return _mainContentItems; } set { _mainContentItems = value; } } 所以客户模块注册它的视图如下: layoutManager.MainContentViews.Add(“customer-help”, this.container.Resolve()); layoutManager.MainContentViews.Add(“customer-main”, this.container.Resolve()); 所以后来我在前面带了一个特定的视图我说: layoutManager.ShowMainContentView(“customer-help”); 为了获得默认视图(第一个注册视图),我说: layoutManager.ShowDefaultView(“customer”); 这很好用。 但是,我想用连字符消除“代码味道”,它将模块名称和视图名称分开,所以我想注册这个命令: layoutManager.MainContentViews.Add(“customer”,”help”, this.container.Resolve()); 但是更换我当前词典的最佳方法是什么,例如我想到的是: Dictionary (doesn’t exist) Dictionary<KeyValuePair, object> Dictionary 新的集合需要能够做到这一点: 获取带模块和视图键的视图(例如“customer”,“help”返回1视图) 按模块键获取所有视图的集合(例如“customer”返回5个视图)

如何从工作线程中调用UI线程上的方法?

我正在开发一个使用以下技术的项目: C#(.NET 4.0) WCF 棱镜4 我目前正在使用代理生成的Begin / End方法对我们的一个Web服务进行异步调用。 调用成功,客户端能够在工作线程上接收Web服务的响应。 收到回复后,我继续举办活动。 订阅该事件的类继续使用PRISM请求UI导航: Application.Current.Dispatcher.BeginInvoke(new Action(() => this.RegionManager.RequestNavigate(RegionNames.LoginContentRegion, projectSelectionViewUri))); 由于未在UI线程上捕获异步WCF响应,因此我不得不使用Application.Current.Dispatcher.BeginInvoke(…)调用UI线程。 这里的问题是调用似乎什么都不做。 UI未更新,并且不会引发exception。 我应该如何从工作线程中引发的事件中调用UI线程? 编辑:此问题已在以下链接中重新询问,因为假设的副本未提供答案: 在异步WCF响应线程上使用PRISM 4请求UI导航

使用带有Frame控件的Prism NavigationService赢得通用应用程序

如何将Prism NavigationService与Frame控件结合起来? 我有一个包含框架的主页面。 首先,我必须导航到主页面,之后我想更改NavigationSerices,以便它使用Frame而不是整个页面。 所以我需要像Windows-Store-App-Prism框架中的Prism 5.0区域。 一个类似的问题已经解决了: 注册导航服务到框架元素而不是页面 – WinRt Prism 2.0,但我不喜欢这个解决方案。