2012-09-11 1 views
0

내 MainWindow.xaml의 CodeBehind가 삭제되었으므로 문자 그대로 이어야하는 작은 프로젝트를 수행하고 있습니다. XAML에서 DataContext 가져 오기

그래서 내가 XAML을 통해 이런 식으로 내 뷰 모델의 인스턴스를 만드는거야 : 나는 (타 솔루션을 열고 원하는

지금
<Grid.DataContext> 
    <lib:StartPageViewModel /> 
</Grid.DataContext> 

글쎄, 내가, 내 코드 (StartPageViewModel)이 DataContext 필요 자세한 내용은 here을 참조하십시오).

이 DataContext를 어떻게 얻을 수 있습니까?

+0

xaml에서 값 lib : StartPageViewModel로 정적 리소스를 개별적으로 정의한 다음 동일한 리소스를 그리드에 바인딩하고 뷰 모델에서 새 속성과 바인딩하여 둘 다 동일한 객체를 가질 수 있습니다. –

답변

1

적어도 나는이 문제를 해결했다. 내가 DataContext를 사용하지 않고 솔루션을 열 수 있습니다, 내가 다음에 코드를 변경

public static DTE2 GetDTE(DataContext dataContext) 
    { 
     ICustomTypeDescriptor typeDescriptor = dataContext as ICustomTypeDescriptor; 
     Debug.Assert(typeDescriptor != null, "Could not get ICustomTypeDescriptor from dataContext. Was the Start Page tool window DataContext overwritten?"); 
     PropertyDescriptorCollection propertyCollection = typeDescriptor.GetProperties(); 
     return propertyCollection.Find("DTE", false).GetValue(dataContext) as DTE2; 
    } 

, 그것은 완벽하게 지금 작동 : 사실 난 정말이의의 DataContext를 사용할 필요가 없습니다 않았다

public static DTE2 GetDTE() 
    { 
     return (DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE"); 
    } 
0

ViewModel은보기에 대해 아무 것도 알아서는 안됩니다.

그래서 '적절한'MVVM을 적용 할 때 ViewModel 내에서 DataContext를 가져 오려고하지 말아야합니다.

StartPageViewModel의 코드는 DataContext에 삽입 된 개체의 일부입니다. 즉, ViewModel 코드에서 this을 사용하여 개체에 액세스 할 수 있습니다. 당신이 그렇게한다면, 당신은에 대한 지식을 추가, 아직

<Grid Name="MyGrid"> 
    <Grid.DataContext> 
     <lib:StartPageViewModel MyParent={Binding ElementName=MyGrid} /> 
    </Grid.DataContext> 
</Grid> 

:

당신은 당신이 XAML에서 속성을 사용하여 전달할 수 (또는 더 높은 VisualTree까지) 그리드를 찾고 있다면 ViewModel을 봅니다.

+0

'this'가'StartPageViewModel'입니다.'this'를 사용하여 DataContext에 접근하는 방법을 알려주실 수 있습니까? 이제 Properties에 액세스 할 수 있습니다. – eMi

+0

DataContext로 무엇을 하시겠습니까? –

+0

적어도 내가 해결했습니다 – eMi

0

은 내가 XAML 파일의 뷰 모델을 선언 한 적이 있지만, 시도 :

viewName.DataContext as ViewModelType; 

을 BTW는 숨김 코드는 일반적으로 좋은 방법입니다 삭제.

+0

View는 다른 프로젝트에 있으므로 Viewname에 액세스 할 수 없으므로 순환 의존성이 있습니다. ViewModel은 다른 프로젝트에 있으며 XAML 프로젝트에 대한 참조가 없어야합니다. – eMi