5

私の問題は非常に単純ですが、すべてのオプションが私を混乱させます...

MEF / Prismアプリケーションでは、特定の動作を1つの特定の領域にアタッチしたいと思います。疑惑は、あなたがそれをそのように行うことができると言っています:

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

しかし、これはどこに置くべきですか?どこかありますか、これはブートストラッパー方式で行われることになっていますか?現在、シェルの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())。

したがって、質問:1つの単一の領域に動作を追加するのに最適な場所はどこですか?

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 に答える