2016-10-07 4 views
3

솔직히, 나는 이것을 묻는 법을 모른다. 먼저 시나리오를 설명해 드리겠습니다. 내 마지막 질문에서 가져온 한 answer에서C#에서 동적 데이터 형식을 사용하는 방법?

:

... 
var frame = sender as Frame; 
UserControl1 uc1 = frame.Content as UserControl1; 
MainViewModel mvm = uc1.DataContext as MainViewModel; 
... 

당신이 frame.Content 변경 사항을 볼 수 있으며 다른 데이터 형식을 가질 수있다. 따라서 나는 단지 UserControl1을 쓸 수 없다. 이제 UserControl1 대신 무엇을 쓸 수 있습니까?

업데이트 : 추가 세부 사항

  • frame.Content

  • 내가 런타임 언제나

동안 frame.ContentDataContext의 현재 데이터 유형을 결정하려면 사용자 상호 작용에 따라 변화하고, 알려주세요 내가 분명히하고 싶다면 나. 항상 FrameworkElement 아니다

var frame = sender as Frame; 
FrameworkElement content = frame.Content as FrameworkElement; 
MainViewModel mvm = content.DataContext as MainViewModel; 

frame.Content 경우 첫 번째를 확인 할 수 있습니다 : 당신이 frame.Content에서 필요로하는 유일한 것은이 DataContext 경우

+0

_actual_ 유형 (또는 부속 유형)이 컴파일 타임에 무엇인지 모르는 경우에는 컴파일 타임 안전을 가질 수 없습니다. 가능한 유형이 조금이라도있는 경우 가장 깨끗한 패턴은 유형을 확인하고 적절하게 형변환하는 것입니다. –

+0

@DStanley 예, 지금은 가능한 수의 가능한 유형이 있지만 실행중인 프로젝트이므로 전체 프로젝트를 완료 할 때 가능한 유형의 수가 증가합니다. 그 유형을 수동으로 확인해야합니까? 그 다음에는 긴 일련의 if 문이 있습니다. – someone

+0

@DStanley 또 다른 질문은,'DataContext'의 모든 필드에 _title_이라는 이름의 필드가 있고 그것이 접근하고자하는 유일한 것인가, if 문의 긴 시리즈를 피할 수 있을까요? – someone

답변

2

당신은 예를 들어이 FrameworkElement에 캐스팅하려고 할 수 있습니다

var frame = sender as Frame; 
FrameworkElement content = frame.Content as FrameworkElement; 
if (content != null) { 
    MainViewModel mvm = content.DataContext as MainViewModel; 
    // work with mvm... 
} 
else { 
    // Frame's content is something unexpected. 
} 
+0

늦게 대응하여 죄송합니다. 네,'frame.Content'에서 필요한 것은'DataContext'이지만'frame.Content'는 변경 중이며 자체의'DataContext'를 가지고 있습니다. 당신의 예제에서'MainViewModel'의 대체물로 쓸 수있는 것은 무엇입니까? 또한 런타임에 현재 DataContext의 DataType (또는 ObjectType)을 확인하려고합니다. – someone

+0

'obj.GetType()'메서드를 사용하여 런타임 객체의 유형을 결정하고 C# 연산자'is'를 사용하여 객체가 특정 유형인지 여부를 확인합니다. 메인 윈도우를 찾고 DataContext를 얻으려면,'Application.Current.MainWindow' 및/또는'LogicalTreeHelper.FindLogicalNode'를 사용하여 필요한 뷰 모델을 가진 객체를 찾으십시오. –

관련 문제