C#에서 ItemsControl의 DataTemplate에 정의된 컨트롤은 어떻게 가져옵니까?

개발 환경: VisualStudio 2010 + Silverlight4
새 테스트.xaml에 다음과 같은 ComboBox 콤보 상자 컨트롤을 추가합니다.
[xhtml] view plain copy
  1. <ComboBox x:Name="cmbBoxCategory" Height="28" Margin="105,69,182,0" VerticalAlignment="Top" SelectionChanged="cmbBoxCategory_SelectionChanged" DataContext="{StaticResource SharingObjectCategoryDataSource}" ItemsSource="{Binding CategoryCollection }" >  
  2.             <ComboBox.ItemTemplate>  
  3.                 <DataTemplate x:Name="cmbTemplate">  
  4.                     <StackPanel Orientation="Horizontal">  
  5.                         <TextBox x:Name="txtID" Text="{Binding Path=ID}"/>  
  6.                         <Image Source="{Binding Path=ImagePath}"/>  
  7.                         <TextBlock x:Name="tbCategoryName" Text="Name"/>  
  8.                     </StackPanel>                      
  9.                 </DataTemplate>  
  10.             </ComboBox.ItemTemplate>  
  11.         </ComboBox>  

DataTemplate에서 txtID라는 TextBox 컨트롤이나 다른 컨트롤을 어떻게 가져올까요?
테스트xaml.cs 파일에서 txtID라는 TextBox 컨트롤, 즉this를 직접 참조할 수 없습니다.txtID는 접근할 수 없습니다. txtID는 DataTemplate 템플릿의 이름 공간 범위 내에 속하기 때문에 (매개 변수와 유사한 역할 영역) Silverlight4 문서의 Template PartAtrribute를 참조할 수 있습니다.DataTemplate의 TextBox 컨트롤은 어떻게 제공됩니까?다음과 같은 방법으로 사용할 수 있습니다.
방법1:
[c-sharp] view plain copy
  1. TextBox txtBox = (TextBox)VisualTreeHelper.GetChild(this.cmbTemplate.LoadContent(), 0);  
  2. // this.cmbTemplate.LoadContent() cmbTemplate DataTemplate ,   
  3. // StackPanel, VisualTreeHelper.GetChild() StackPanel ,  
  4. // Silverlight4 LoadContent()   

방법2:
[c-sharp] view plain copy
  1. StackPanel panel = (StackPanel)this.cmbTemplate.LoadContent();  
  2. TextBlock tbCategory=panel.FindName("tbCategoryName"as TextBlock;  
  3. // Silverlight4 FindName()   

대상
TextBox txtBox = (TextBox)VisualTreeHelper.GetChild(this.cmbTemplate.LoadContent(), 0);
Text의 값은 데이터 원본을 연결하는 ID 속성 (예: {Binding Path=ID}) 이고, 프로그램을 통해 동적으로 생성되는 값이기 때문에, 이 두 가지 방식으로 얻어진 TextBox의 Text는 빈 값이고, tbCategoryName 이름의 TextBlock은 고정된 'Name' 문자열이기 때문에 이 두 가지 방법으로 얻어진 TextBlock의 Text값은 'Name' 이다.
선택한 ComboBoxItem의 TextBox 값 또는 Image의 Source 값을 얻으려면 다음과 같이 하십시오.
[c-sharp] view plain copy
  1. //test.xaml.cs   
  2. private void cmbBoxCategory_SelectionChanged(object sender, SelectionChangedEventArgs e)  
  3.         {  
  4.             if (this.cmbBoxCategory.SelectedItem!=null)  
  5.             {  
  6.                 ComboBox item = sender as ComboBox;  
  7.          Category cat = (Category)this.cmbBoxCategory.SelectedItem;  
  8. //Category cmbBoxCategory , cat ImagePath   
  9.            this.imgObject.Source = new BitmapImage(new Uri(cat.ImagePath, UriKind.Relative));  
  10. //imgObject test.xaml Image                   
  11.             }  
  12.      }  

더 좋은 방법으로 귀속 데이터 원본을 얻을 때 동태적으로 생성된 값을 얻을 수 있다. 본인은 재능이 없어서 아직 이 방법을 생각해 내지 못했기 때문에 위의 방법으로 얻을 수 있고 해당하는 방법을 찾으면 업데이트를 할 수 있다.
출처:http://blog.csdn.net/wackelbh/article/details/6003947#comments

좋은 웹페이지 즐겨찾기