Csharp/C#教程:棱镜4 – 局部范围的RegionManager分享


棱镜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。

我遇到了与你相同的情况,我有一个嵌套的区域经理,但所有的子视图仍然是全球区域经理。 我提出了我认为合理的解决方案。

首先我定义一个接口:

 ///  /// An interface which is aware of the current region manager. ///  public interface IRegionManagerAware { ///  /// Gets or sets the current region manager. ///  ///  /// The current region manager. ///  IRegionManager RegionManager { get; set; } } 

然后我像这样设置RegionBehavior

 ///  /// A behaviour class which attaches the current scoped  to views and their data contexts. ///  public class RegionAwareBehaviour : RegionBehavior { ///  /// The key to identify this behaviour. ///  public const string RegionAwareBehaviourKey = "RegionAwareBehaviour"; ///  /// Override this method to perform the logic after the behaviour has been attached. ///  protected override void OnAttach() { Region.Views.CollectionChanged += RegionViewsChanged; } private void RegionViewsChanged(object sender, NotifyCollectionChangedEventArgs e) { Contract.Requires(e != null); if (e.NewItems != null) foreach (var item in e.NewItems) MakeViewAware(item); } private void MakeViewAware(object view) { Contract.Requires(view != null); var frameworkElement = view as FrameworkElement; if (frameworkElement != null) MakeDataContextAware(frameworkElement); MakeAware(view); } private void MakeDataContextAware(FrameworkElement frameworkElement) { Contract.Requires(frameworkElement != null); if (frameworkElement.DataContext != null) MakeAware(frameworkElement.DataContext); } private void MakeAware(object target) { Contract.Requires(target != null); var scope = target as IRegionManagerAware; if (scope != null) scope.RegionManager = Region.RegionManager; } } 

然后将其应用于引导程序中的所有区域:

 protected override IRegionBehaviorFactory ConfigureDefaultRegionBehaviors() { var behaviours = base.ConfigureDefaultRegionBehaviors(); behaviours.AddIfMissing(RegionAwareBehaviour.RegionAwareBehaviourKey, typeof(RegionAwareBehaviour)); return behaviours; } 

然后你要做的就是在你的view / viewmodel上实现IRegionManagerAware ,可能是这样的:

 public class MyView : IRegionManagerAware { IRegionManager RegionManager { set; get; } } 

然后,当此视图添加到区域时,该行为将正确地将RegionManager属性设置为当前作用域区域管理器。

如果你阅读文档中的下一行,它会说“Add方法将返回视图可以保留的新RegionManager,以便进一步访问本地范围。”

所以我会在视图中创建一个属性并将IRegionManger传递给它。

在你的视图/ viewModel中。

 public IRegionManager rm { get; set; } 

然后传递添加新视图后返回的IregionManager

 view.rm = detailsRegionManager; 

希望有所帮助。

上述就是C#学习教程:棱镜4 – 局部范围的RegionManager分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

www.ctvol.com true Article Csharp/C#教程:棱镜4 – 局部范围的RegionManager分享

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1002426.html

(0)
上一篇 2021年12月28日 上午9:39
下一篇 2021年12月28日 上午9:39

精彩推荐