我在哪里向单个区域添加行为?

时间:2012-12-04 15:40:01

标签: prism mef

我的问题非常简单,但所有选项都让我感到困惑......

在我的MEF / Prism应用程序中,我想将特定行为附加到一个特定区域。 doumentation说,你可以这样做:

IRegion region = regionManager.Region["Region1"];
region.Behaviors.Add("MyBehavior", new MyRegion());

但我应该把它放在哪里?有没有地方,这应该是在bootstrapper方法中完成的?目前,我在shell的Loaded-event中添加了这样的行为:

    /// <summary>
    /// Interaction logic for Shell.xaml
    /// </summary>
    [Export(typeof(Shell))]
    public partial class Shell
    {
        [ImportingConstructor]
        public Shell(IRegionManager regionManager, ElementViewInjectionBehavior elementViewInjectionBehavior)
        {
            InitializeComponent();
            Loaded += (sender, args) =>
                          {
                              IRegion region = regionManager.Regions[RegionNames.ElementViewRegion];
                              region.Behaviors.Add("ElementViewInjection", elementViewInjectionBehavior);
                          };
        }
    }

这是一个很好的解决方案吗?我宁愿在引导程序中执行它,以便它在与其他区域行为注册(ConfigureDefaultRegionBehaviors())相同的位置完成。

所以,问题是:将行为添加到单个区域的最佳位置在哪里?

2 个答案:

答案 0 :(得分:2)

我刚刚提出了一个稍微改进的解决方案,在行为中使用静态字符串集合添加区域以附加行为。

public class ViewModelInjectionBehavior : RegionBehavior, IDisposable
{
    private static List<string> _regionNames; 

    public static List<string> Regions
    {
        get { return _regionNames ?? (_regionNames = new List<string>()); }
    }       

    protected override void OnAttach()
    {
        if (Regions.Contains(Region.Name)) {...}          
    }        
}

然后在我的引导程序中,我可以定义区域:

    protected override IRegionBehaviorFactory ConfigureDefaultRegionBehaviors()
    {
        var behaviorFactory = base.ConfigureDefaultRegionBehaviors(); 

        ViewModelInjectionBehavior.Regions.Add(RegionNames.ElementViewRegion);
        behaviorFactory.AddIfMissing("ElementViewInjectionBehavior", typeof(ViewModelInjectionBehavior));

        return behaviorFactory;
    }

至少,这种行为现在普遍可用......

答案 1 :(得分:1)

我们遇到了同样的问题 - 最后我们只检查了区域行为中的区域名称,并且仅在它是我们想要的区域时才采取行动,因为您将行为附加到所有区域而感觉很糟糕 - 但对我们而言它比建议的解决方案更好..

示例如下:

public class TrackViewOpenerBehaviour : IRegionBehavior
{
    public IRegion Region { get; set; }
    public void Attach()
    {
        if (this.Region.Name == ApplicationRegions.WorkspaceRegion
            || this.Region.Name == ApplicationRegions.DialogRegion)
        {
             this.Region.Views.CollectionChanged += (sender, e) =>
             {
                 //Code Here.
             };

        }
    }
 }

我一直认为也许我们可以创建一个行为来负责将其他行为附加到特定区域给我们,然后我们可以在引导程序中注册它 - 但是从来没有接受它。