2011-01-18 1 views
3

Mvvm-Light를 사용 중이며 XAML의 바인딩이 실제로 지금까지 어떻게 작동 하는지를 무시했습니다.View (Mvvm-Light)의 객체에 바인딩 할 수 있도록 ViewModel DataContext를 어떻게 오버라이드합니까?

여기

제대로 내 뷰 모델 (SecuirtyPanelViewModel)에 결합 {바인딩 페이지 이름} {SecuritySystemName 바인딩}

<phone:PhoneApplicationPage.Resources> 
</phone:PhoneApplicationPage.Resources> 

<Grid x:Name="LayoutRoot" Background="Transparent"> 

    <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,14"> 
     <TextBlock x:Name="ApplicationTitle" Text="{Binding SecuritySystemName}" Style="{StaticResource PhoneTextNormalStyle}"/> 
     <TextBlock x:Name="PageTitle" Text="{Binding PageName}" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> 
    </StackPanel> 

    <TextBlock Name="textCode" 
     DataContext="{WHAT GOES HERE to bind to properties on my View (SecurityPanelPage class)}"  
     Text="{Binding Path=Code}" /> 

</Grid> 

내 XAML

입니다. 하지만 TextBlock 요소의 {Binding Code}가 ViewModel이 아닌 VIEW에 바인딩되기를 바랍니다.

저는 DataContext 및 Binding에서 지원하는 구문과 값을 설명하는 설명서 &을 검색 및 검색했습니다. 아무것도 도움이되지 않았습니다.

내가 알고 싶은 것은 DataContext를 설정하거나 (예 : {Binding ...}에서 내 View 객체를 가리키는 무언가를 지정하는 것입니다. "Self"및 모든 종류의 "RelativeSource" 일,하지만 아무도 작업 추측이 XAML 전에 디버거에 왕복 구문 분석되기 때문에 생산하지 않습니다 너무 깁니다

감사

UPDATE -... 나는 나 이동 취득하는 답을 찾았지만, 나는 여전히 나는 아래의 훌륭한 포스터에 대한 질문을 따르므로 grok하지 마라.

작동 방식 :

<phone:PhoneApplicationPage x:Name="ThisPage"> 
    <TextBlock Name="textCode" Text="{Binding Code, ElementName=ThisPage"/> 
</phone:PhoneApplicationPage> 

나는 여기에 힌트를 발견 : http://bursjootech.blogspot.com/2007/12/bind-from-xaml-to-local-property-in.html

그는 다르게 질문을 : 어떻게 "숨김 코드에서 지역 특성에 XAML에서 바인딩"로 설정합니다.

아래 제공된 두 가지 해결책을 여전히 이해할 수 없습니다. 아래에 더 많은 질문이 있습니다 ...

답변

5

일반적으로 MVVM을 사용할 때 거의 모든 바인딩 가능한 속성이 뷰 모델이 아니라 ViewModel에 있습니다. 그러나 분명히 때때로 속성이있는 구성 요소 컨트롤을 만들려고합니다. 당신은 그 부동산이 무엇인지, 왜 그것이 단지보기에있는 부동산 일 필요가 있는지 설명 할 수 있습니까?

그 말은 ... 당신의 SecurityPanelPage가 XAML에 대한보기라고 생각합니까?

컨트롤에 이름을 지정한 다음 ElementName 바인딩을 사용할 수 있습니다. 이렇게하면 DataContext를 설정할 필요가 없습니다. 다음

<phone:PhoneApplicationPage 
    x:Name="controlName" 
    x:Class="SomeNamespace.SecurityPanelPage"> 
</phone:PhoneApplicationPage> 

그리고 당신의 바인딩을 변경 : 내가 정확 해요 경우

<TextBlock 
    Name="textCode" 
    DataContext="{Binding ElementName=controlName}" 
    Text="{Binding Path=Code}" /> 
+0

확인하는 데 도움이됩니다. 나는 당신이 뭔가 다른 것을 제안하고 샘플이 완전하지 않다고 생각했습니다. 하지만 이제는 당신이 위에서 찾은 것과 같은 해결책을 제공하고있는 것을 봅니다. – tig

+0

후속 조치를 요청하겠습니다. DataContext를 사용하는 예제에서 DataContext의 다른 구문이 루트에 도달하게되는 방법은 무엇입니까? 나는 전에 무언가를 보았지만 기억할 수는 없다고 맹세한다. – tig

+0

오, 그리고 내 ViewModel에 속한이 물건에 대해 당신이 맞습니다. 나는 게으르다가 다음에이 일을하는 법을 알고 싶어서 산만 해졌다. 이제 코드가 속한 VM으로 다시 이동합니다. – tig

1

, 당신은 자원을 추가 할 수 있습니다

<TextBlock 
    Name="textCode" 
    Text="{Binding Path=Code, ElementName=controlName}" /> 

명시 적으로 DataContext를 사용하면 다음을 수행 할 수 있습니다를 설정하려면 app.xaml에서 원하는보기로 이동하십시오.

대답E :

xmlns:crap="clr-namespace:Application.Views" 
<Application.Resources> 
    <ResourceDictionary> 
     <crap:MyViewPage x:Key="MyViewPage" /> 
    </ResourceDictionary> 
</Application.Resources> 

다음이/작동 "{Binding MyProperty, source={StaticResource MyViewPage}".

희망처럼 사용 내가 먼저 대답을 읽을 때 나는 그것을 grok 수 않았다

+0

내보기의 XAML에서 를 사용하여 동일한 작업을 수행하는 방법은 무엇입니까? 내보기에 해당하는 "xmlns : crap"을 정의하는 방법을 이해할 수 없습니다. – tig

+0

"Application.Views"는 내 응용 프로그램의 Views 디렉토리입니다. 하지만 xaml의 개체에 바인딩하려는 경우 joe mcBride의 솔루션이 더 좋습니다. –

관련 문제