2011-06-12 6 views
0

에 대한 참조를 얻 나는이처럼 내 VM을 실체화 : 내 명령에 바인딩있을 때 괜찮지 만,UserControl.Resources이/뷰 모델

DataContext="{Binding Source={StaticResource ViewModelLocatorService}, Path=FlowDateRatchetViewModel}" 

, 나는 보통 이렇게 :

Command="{Binding ElementName=ucFlowDateRatchets, Path=DataContext.AddFlowDateRatchetCommand}" 

DataContext가 ViewModel 내에 있으므로 템플릿에있을 때 수행해야하는 작업이 있으며 맨 위에서 시작할 수 있습니다.

유사한 무언가 할 수있는 방법이 있나요 :

<UserControl.Resources> 
    <VM:FlowDateRatchet x:key="FlowDateRatchetViewModel" Constructor?????={Binding.... 
</UserControl.Resources> 

그렇게 명령이 될 것이라고 :

Command="{Binding Source={StaticResource FlowDateRatchetViewModel}, Path=AddFlowDateRatchetCommand}" 

난 항상 문제가 보장하는 것 같다 내가 올바른 컨텍스트에서 시작하고 그 내 데이터 바인딩을 지정할 때이 구문을 사용하면 루트가 안정적으로 유지됩니다. IMHO

어디로 잘못 가고 있습니까?

답변

0

Dan Wahlin 부모 컨트롤의 DataContext에 대한 바인딩을 단순화하고 싶었는데이 아름다움을 보았습니다 : DataContextProxy. DataContext 속성을 통해 클래스에 대한 참조를 얻는 것처럼 클래스를 인스턴스화하고 참조를 얻으려고 시도하는 동안 Dan은 다른 경로를 사용하여 DataContext에서 인스턴스화 된 클래스를 만들고 참조를 얻을 수있었습니다. 그는 자신의 기사에서 설명하는 것처럼 부모 객체의 DataContext 속성을 참조하는 클래스를 만들고 User.Resources 참조 (즉 프록시 접미어!)에 해당 참조를 표시합니다. 그런 다음 바인딩은 StaticReference 바인딩 특성을 사용하여 참조를 얻을 수 있습니다.

UserControl의 이름을 지정하고 ElementName 특성을 사용하여 동일한 작업을 수행했습니다. 단점은 UC의 이름을 지정했기 때문에 동일한 UC를 여러 번 사용하면 페이지에 중복 이름이 표시된다는 것입니다. 또는 2) SL5에서 RelativeSource를 사용하고 AncestorType을 통해 UserControl을 가리 킵니다. 둘 다 길어지고 경로는 Path = "DataContext"가되어야합니다. 나는 싫어했다.

아직 실험하고 있지만 이것이 트릭을 멋지게 처리하고 바인딩에서 명확성을 보장한다고 생각합니다.

나는 하나의 작은 변화를 만들어, 그리고 약간의 RX가 약한 참조를 통해 이벤트에 가입 사랑을 뿌려 :

Observable.FromEvent<RoutedEventArgs>(this,"Loaded") 
      .Subscribe(pEvent => DataContextProxy_Loaded(pEvent.Sender, pEvent.EventArgs)); 

보다는

this.Loaded += new RoutedEventHandler(DataContextProxy_Loaded);