외부 설정 파일의 정보를 기반으로 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;
}
을하는 데 도움이됩니다. 더 간단한 버전의 페이지를 사용해 보겠습니다. 계속 진행해야합니다. _resultsGridLoaded를 false로 초기화하고 RowDetailsVisibilityMode를 VisibleWhenSelected로 설정하여 다른 뭔가가 있어야하지만 단서를 가져 주셔야합니다! –
나는이 문제를 발견했다고 생각한다. 업데이트 된 게시물에서 솔루션을 확인하십시오. 어떤 이유로 StackOverflow에 내 XMAL이 표시되지만 기본적으로 SelectionChange 이벤트를 DataGrid에 추가했습니다. 도움이된다면 행운을 빕니다! –
감사! 이제 작동합니다. 열쇠는 DataGrid의 SelectionChanged 핸들러에서 _resultsGridLoaded 플래그를 false로 재설정하는 데 실제로 사용되었습니다.이로 인해 세부 사항보기가 열릴 때마다 데이터가로드됩니다. 매번 그렇게 할 필요가 있다는 것이 이상한 것처럼 보이지만 작동합니다. BTW, 나는 당신의 대답을 도움이 될만한 점수로 만들지 못한다. –