- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有 Silverlight 4 应用程序和 PRISM 4,我正在使用 MEF。
我的 Shell 定义了一个加载模块的主要区域,我希望模块有自己的 RegionManager,因此它们定义的区域位于本地 RegionManager 中,而不是全局的。我希望这个本地 RegionManager 在模块内部由容器(对于 IRegionManager 类型)解析。
但是文档中的方法:
IRegion detailsRegion = this.regionManager.Regions["DetailsRegion"];
View view = new View();
bool createRegionManagerScope = true;
IRegionManager detailsRegionManager = detailsRegion.Add(view, null,
createRegionManagerScope);
对我不起作用,当从 subview 内部解析 IRegionManager 时,我仍然得到 GlobalRegionManager。
最佳答案
我和你的情况一样,我有一个嵌套的区域管理器,但是所有的 subview 仍然得到全局区域管理器。我提出了我认为合理的解决方案。
首先我定义了一个接口(interface):
/// <summary>
/// An interface which is aware of the current region manager.
/// </summary>
public interface IRegionManagerAware
{
/// <summary>
/// Gets or sets the current region manager.
/// </summary>
/// <value>
/// The current region manager.
/// </value>
IRegionManager RegionManager { get; set; }
}
然后我像这样设置一个 RegionBehavior
:
/// <summary>
/// A behaviour class which attaches the current scoped <see cref="IRegionManager"/> to views and their data contexts.
/// </summary>
public class RegionAwareBehaviour : RegionBehavior
{
/// <summary>
/// The key to identify this behaviour.
/// </summary>
public const string RegionAwareBehaviourKey = "RegionAwareBehaviour";
/// <summary>
/// Override this method to perform the logic after the behaviour has been attached.
/// </summary>
protected override void OnAttach()
{
Region.Views.CollectionChanged += RegionViewsChanged;
}
private void RegionViewsChanged(object sender, NotifyCollectionChangedEventArgs e)
{
Contract.Requires<ArgumentNullException>(e != null);
if (e.NewItems != null)
foreach (var item in e.NewItems)
MakeViewAware(item);
}
private void MakeViewAware(object view)
{
Contract.Requires<ArgumentNullException>(view != null);
var frameworkElement = view as FrameworkElement;
if (frameworkElement != null)
MakeDataContextAware(frameworkElement);
MakeAware(view);
}
private void MakeDataContextAware(FrameworkElement frameworkElement)
{
Contract.Requires<ArgumentNullException>(frameworkElement != null);
if (frameworkElement.DataContext != null)
MakeAware(frameworkElement.DataContext);
}
private void MakeAware(object target)
{
Contract.Requires<ArgumentNullException>(target != null);
var scope = target as IRegionManagerAware;
if (scope != null)
scope.RegionManager = Region.RegionManager;
}
}
然后将其应用于 Bootstrap 中的所有区域:
protected override IRegionBehaviorFactory ConfigureDefaultRegionBehaviors()
{
var behaviours = base.ConfigureDefaultRegionBehaviors();
behaviours.AddIfMissing(RegionAwareBehaviour.RegionAwareBehaviourKey, typeof(RegionAwareBehaviour));
return behaviours;
}
然后你所要做的就是在你的 View / View 模型上实现IRegionManagerAware
,大概是这样的:
public class MyView : IRegionManagerAware
{
IRegionManager RegionManager { set; get; }
}
然后当这个 View 被添加到一个区域时,该行为将正确地将 RegionManager
属性设置为当前作用域的区域管理器。
关于c# - Prism 4 - 本地范围的 RegionManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6582612/
我有一个自定义控件,它派生自用户控件。 public class CustomControl : ContentControl { public static readonly Depende
我有 Silverlight 4 应用程序和 PRISM 4,我正在使用 MEF。 我的 Shell 定义了一个加载模块的主要区域,我希望模块有自己的 RegionManager,因此它们定义的区域位
我正在 Prism 中编写应用程序。我有一个用户控件,包含两个 控制。这两个都有分配给他们的区域。用户控件托管在 Window 中。使用 ShowDialog() 显示. 我正在使用 View 发现将
我将 prism5 与 regionManager 一起使用。以下是我如何注册我的观点以及我如何尝试导航。 _container.RegisterType("MyView"); 这就是我的导航方式 _
我在使用方法时遇到问题 this.regionManager.RegisterViewWithRegion("TextRegion", typeof(TextView)); 如果我以某种方法在 Boo
我正在将 VB.NET PRISM 模块转换为 C#。这是一个非常简单的事情,目前在 VB.NET 中工作。它显示绑定(bind)到 ViewModel 的字符串值。 View 的 XAML(我将其切
我为 DevExpress 功能区编写了一个自定义区域适配器。 public class dxDocumentGroupRegionAdapter : RegionAdapterBase {
我正在开发一个 Prism 应用程序,它包含一个包含多个子区域的 TabControl。因此,我根据 Brian Lagunas 在他的 PluralSight 类(class)中描述的模式实现了自定
我正在使用 Prism用于在我的 WPF MVVM 应用程序中导航。我的观点如下。 // MyView is the data type of the view I want to register
我是一名优秀的程序员,十分优秀!