2009-11-08 5 views
1

나는 모든 데이터 비트를 처리하기 위해 MVVM을 사용하는 Silverlight 페이지를 사용했습니다.Silverlight Binding

데이터 컨텍스트를 사용하여 페이지에 설정된다

DataContext="{Binding AddNewClientViewModel, Source={StaticResource ServiceLocator}}" 

ServiceLocator 나 만들고 IOC는 컨테이너를 사용하여 적절한 VM을 주입 할 수있는 서비스 인.

이 모든 것이 정상적으로 작동합니다.

지금 나는 DATAFORM과 같이 있습니다

 <df:DataForm CurrentItem="{Binding NewClient}" AutoGenerateFields="False" > 
     <df:DataForm.NewItemTemplate> 
      <DataTemplate> 
       <StackPanel> 
        <df:DataField> 
         <TextBox Text="{Binding ClientName}" /> 
        </df:DataField> 
        <df:DataField> 
         <TextBox Text="{Binding Property_on_the_VM_not_on_NewClient}" /> 
        </df:DataField> 
       </StackPanel> 
      </DataTemplate> 
     </df:DataForm.NewItemTemplate> 
    </df:DataForm> 

좋아, 그럼이 DATAFORM 내 뷰 모델에 NewClient 속성에 바인딩합니다. 첫 번째 DataField는 NewClient.ClientName에 바인딩됩니다. 두 번째 DataField 내가 루트 ViewModel 교수형 속성에 바인딩하고 싶습니다.

바인딩 할 때 전달할 수있는 '소스'매개 변수가 있다는 것을 알고 있습니다. VM의 정적 리소스가 있거나 비슷한 점을 지적 해 놓았을 때 전달할 수 있지만, 그렇지 않습니다. 이 바인딩을 상위 VM의 속성과 어떻게 연결할 수 있습니까?


JOBI는 아래의 게시물 후 편집

, 내가 해봤 다음

<TextBox DataContext="{Binding DataContext, ElementName=root}" Text="{Binding MyProperty}" /> 

그리고 내 최고 수준의 제어 : 점점

x:Name="root" 
DataContext="{Binding AddNewClientViewModel, Source={StaticResource ServiceLocator}}" 

아니 주사위를 이 일을 ...

답변

2

필요한 것은 DataContextProxy which was created by Dan Wahlin입니다. 문제는 일단 데이터 폼에 들어가면 새로운 데이터 컨텍스트가 생기는 것입니다. 뷰의 데이터 컨텍스트에 쉽게 도달 할 수있는 방법은 없습니다. 데이터 컨텍스트 프록시를 사용하면이 작업을 쉽게 수행 할 수 있으며 사용 해본 결과 상당히 효과적이었습니다.

+0

트릭과 같습니다. 구현 및보고합니다. – ChadT

0

두 번째 TextBox에서 부모 VM이 이미 DataContext를 가지고있는 루트 요소에 대한 ElementName 바인딩을 수행 할 수 있습니다.

<TextBox DataContent="{Binding DataContext, ElementName=rootLevelControl}" Text="{Binding property}" 
+0

안녕하세요 Jobi,이게 제대로 작동하는 것 같지만 아무런 행운이 없습니다. 나는 이것을 사용하려고 시도한 나의 질문을 업데이트 할 것이다. – ChadT