2010-02-18 7 views
1

외부 설정 파일의 정보를 기반으로 DataGrid의 템플릿 내에서 내용을 동적으로 설정해야합니다. 이 설정 파일은 DataGrid에 표시 할 데이터 필드를 지정합니다. 응용 프로그램 관리자는 설정을 편집하여 표시 할 필드를 변경할 수 있습니다. 표시 할 필드를 하드 코딩 할 수 없습니다.Silverlight에서 내용을 프로그래밍 방식으로 설정 DataGrid 세부 정보

런타임시 DataGrid에 쉽게 열 (DataGridTextColumn 's)을 추가 할 수 있습니다. 설정에 따라 항목 원본의 필드에 바인딩을 설정하면 정상적으로 표시됩니다.

이제 사용자가 행을 클릭 할 때 세부 정보를 표시해야합니다. DataTemplate을 사용하여 RowDetailsTemplate을 설정하고 내부에 Grid (또는 StackPanel)를 추가하여 서식을 지정했습니다. 필드에 바인딩이있는 TextBlocks를 마크 업에 추가하면 세부 정보가 잘 표시됩니다.

그러나 어떻게 세부 템플릿의 Grid/StackPanel의 내용을 프로그래밍 방식으로 설정할 수 있습니까? 시작할 때 이름으로 참조하려고하면 Grid/StackPanel 컨트롤이 null입니다 (예 : Loaded 이벤트 페이지). Grid/StackPanel에서 Loaded 이벤트를 사용하여 세부 정보를 추가하려고했습니다. 이 코드는 실행되고 Grid/StackPanel에 내용을 추가하는 것처럼 보입니다. 그러나 행을 클릭하면 아무 것도 실제로 나타나지 않습니다. 문제는 템플릿/Grid가 이미로드되어 있고 내가 작성한 변경 사항을 무시한다는 것입니다.

다음은 Loaded 이벤트 처리기에서 사용하고있는 코드 샘플입니다. 이처럼 간단한 작업을 수행하더라도 행을 클릭 할 때 세부 정보 창이 나타나지 않습니다.

<data:DataGrid.RowDetailsTemplate> 
    <DataTemplate> 
     <Border Background="LightBlue" > 
      <StackPanel x:Name="resultsDetailsPanel" 
       Orientation="Vertical" 
       Loaded="resultsDetailsPanel_Loaded"> 
      </StackPanel> 
     </Border> 
    </DataTemplate> 
</data:DataGrid.RowDetailsTemplate> 



    private void resultsDetailsPanel_Loaded(object sender, RoutedEventArgs e) 
    { 
     if (_resultsGridLoaded) 
      return; 

     StackPanel detailsPanel = sender as StackPanel; 

     TextBlock fieldNameTextBlock = new TextBlock(); 
     fieldNameTextBlock.Text = "TESTING"; 
     detailsPanel.Children.Add(fieldNameTextBlock); 

     _resultsGridLoaded = true; 
    } 

답변

1

나는 실제로 코드를 시도하고 작동 중입니다. 확인해야 할 두 가지 사항은 다음과 같습니다.

  • _resultsGridLoaded 변수가 false로 초기화 되었습니까?
  • DataGrid에서 RowDetailsVisibilityMode = "VisibleWhenSelected"를 설정 했습니까?

업데이트 : 어떤 이유로 더 이상 작동하지 않습니다. 그러나 나는 그것을 고칠 수있는 두 가지 방법을 찾았습니다.

  1. resultsGridLoaded 로직을 제거하십시오. 당신이 그 논리를해야하는 경우
  2. , 당신의 데이터 그리드에 인 selectionchanged 이벤트에 대한 처리기를 추가 할 수 있습니다 거기에 당신이 거짓 그래서 새로운 StackPanel의에 _resultsGridLoaded 변수를 설정할 수 있습니다 얻을 컨텐츠가 올바르게 추가 :


    
     
      
       
       
      
     
    

 
뒤에

그리고 코드 :

private void resultsPanel_Loaded(object sender, RoutedEventArgs e) 
{ 
    if (_resultsGridLoaded) 
     return; 

    StackPanel pane = (StackPanel)sender; 

    TextBlock newChild = new TextBlock() 
    { 
     Text = "New text" 
    }; 

    pane.Children.Add(newChild); 

    _resultsGridLoaded = true; 
} 

private void grid_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    _resultsGridLoaded = false; 
} 

희망이 당신을 위해 작동하는지 흥미

+0

을하는 데 도움이됩니다. 더 간단한 버전의 페이지를 사용해 보겠습니다. 계속 진행해야합니다. _resultsGridLoaded를 false로 초기화하고 RowDetailsVisibilityMode를 VisibleWhenSelected로 설정하여 다른 뭔가가 있어야하지만 단서를 가져 주셔야합니다! –

+0

나는이 문제를 발견했다고 생각한다. 업데이트 된 게시물에서 솔루션을 확인하십시오. 어떤 이유로 StackOverflow에 내 XMAL이 표시되지만 기본적으로 SelectionChange 이벤트를 DataGrid에 추가했습니다. 도움이된다면 행운을 빕니다! –

+0

감사! 이제 작동합니다. 열쇠는 DataGrid의 SelectionChanged 핸들러에서 _resultsGridLoaded 플래그를 false로 재설정하는 데 실제로 사용되었습니다.이로 인해 세부 사항보기가 열릴 때마다 데이터가로드됩니다. 매번 그렇게 할 필요가 있다는 것이 이상한 것처럼 보이지만 작동합니다. BTW, 나는 당신의 대답을 도움이 될만한 점수로 만들지 못한다. –

관련 문제