2012-12-04 2 views
3

내 문제는 매우 간단하지만 모든 옵션이 나를 혼란스럽게합니다 ...단일 지역에 비헤이비어를 추가하려면?

내 MEF/프리즘 응용 프로그램에서 한 특정 영역에 특정 동작을 첨부하고 싶습니다. doumentation은 당신이 그렇게 할 수 있다고 말합니다 :

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

하지만 어디에 넣어야합니까? 부트 스트 래퍼 (bootstrapper) 방법으로 수행해야하는 장소가 있습니까? 현재, 셸의 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

우리는 같은 문제가있었습니다. 결국 지역 행동의 지역 이름을 확인하고 행동을 취했습니다. 우리가 원했던 지역 일 경우에만 행동했습니다. 모든 지역에 행동을 첨부하기 때문에 짜증이납니다. 난 항상 어쩌면 우리는 우리를 위해 지역을 specfiic 다른 행동을 부착에 대한 책임 행동을 만들 수 있다고 생각

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

     } 
    } 
} 

우리가 다음 : 우리는 같은

예는 보이는 .. 제안 된 솔루션보다 더 나은했다 부트 스트 래퍼에 등록 할 수는 있지만 결코 돌아갈 수는 없습니다.

+0

, 그러나 적어도 그 그 트릭을 수행하고 2 달 내에 무슨 일이 벌어지고 있는지 이해하고 싶다면 투명하다.) 나는 나머지 부분을 정리하는 "메타 행동"을 설정하는 생각을 좋아한다. 어떤 행동을 어느 영역에 붙여야하는지 정의하십시오. XAML에서 동작을 연결하는 방법에 대해 생각했지만 실제로 생각할 시간이 없습니다. 어쨌든, 고마워! – 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; 
    } 

이 적어도, 행동은 이제 보편적으로 사용할 수 ... 아직도 정말 만족 아니에요

관련 문제