5

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

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

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

但是我应该把这个放在哪里?有没有地方,这应该在引导方法中完成?目前,我在 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()) 相同的位置完成。

那么问题来了:将行为添加到单个区域的最佳位置在哪里?

4

2 回答 2

3

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

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;
    }

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

于 2013-01-15T14:49:31.647 回答
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.
             };

        }
    }
 }

我一直认为也许我们可以创建一个行为,负责为我们将其他行为附加到特定区域,然后我们可以在引导程序中注册它——但从未考虑过它。

于 2012-12-04T17:04:29.500 回答