2012-12-04 55 views
3

我的問題很簡單,但所有選項都讓我困惑......我在哪裏添加行爲到單個區域?

在我的MEF/Prism應用程序中,我想將特定行爲附加到一個特定區域。該doumentation說,你可以這樣做:

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

但我應該把這個?有沒有地方,這應該是在引導程序的方法?目前,我在外殼的加載事件添加的行爲是這樣的:

/// <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

我們遇到了同樣的問題 - 最後我們只檢查了區域名稱中的區域行爲,並且只有當它是我們想要的區域時才採取行動,因爲您將行爲附加到所有區域,我們這是比建議的解決方案更好..

示例如下:

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

     } 
    } 
} 

我一直以爲,也許我們可以創建一個行爲負責安裝其他行爲來specfiic地區對我們來說,那我們可以在引導程序中註冊 - 但從未接受過。

+0

這仍然算不上令人滿意,但至少其一個務實的方法,如果你想了解在幾個月內發生的事情,這個技巧就會變得透明,而且是透明的;)我喜歡設置一個「元行爲」來區分其餘的問題,儘管問題仍然在哪裏定義哪些行爲必須附加到哪些區域。我想到了一種在XAML中附加行爲的方式,但我現在沒有時間思考。 Anway,謝謝! – Marc

+0

我對此很感興趣,再次我沒有時間思考這個問題 - 這種方法雖然不是很好,但它可以幫助我們簡單理解哪些地區正在做什麼。如果我有時間找出更好的東西,我會回到這裏:) –

+0

我發佈了一個稍微改進的解決方案。也許你有興趣。 – Marc

1

我剛想出一個稍微改進的解決方案,在行爲中使用靜態字符串集合來添加要附加行爲的區域。

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

至少,行爲是現在普遍使用.​​.....