2016-12-19 6 views
1

UWP 앱에서 MyListView 용 DataTemplate은 Page.Resources의 DataTemplateA 또는 DataTemplateB에 코드 숨김으로 설정됩니다. 각 데이터 템플릿에는 DisplayGridButton과 다른 그리드 (DisplayGrid)가 포함 된 그리드 (TopGrid)가 포함되어 있습니다.그리드가 DataTemplate 안에있을 때 그리드의 가시성을 설정하는 방법은 무엇입니까?

는 DisplayGrid는 SecondListView과 HideGridButton

DisplayGridButton이 DisplayGrid를 표시해야합니다 포함되어 있습니다. HideGridButton은 DisplayGrid를 축소해야합니다.

XAML은

<Page.Resources> 
    <DataTemplate x:Key="DataTemplateA"> 
     <Grid Name="TopGrid"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="auto"/> 
       <RowDefinition Height="*"/> 
      </Grid.RowDefinitions> 
      <StackPanel Orientation="Horizontal"> 
       <TextBox/> 
       <Button Name="DisplayGridButton" Content="Show" Margin="10,0" Click="DisplayGridButton_Click"/> 
      </StackPanel> 
      <Grid Name="DisplayGrid" Grid.Row="1" Visibility="Collapsed"> 
       <StackPanel> 
        <Button Name="HideGridButton" Content="Hide" Click="HideGridButton_Click"/> 
        <ListView Name="SecondListView"> 
         <ListView.ItemTemplate> 
          <DataTemplate > 

          </DataTemplate> 
         </ListView.ItemTemplate> 
        </ListView> 
       </StackPanel> 
      </Grid> 
     </Grid> 
    </DataTemplate> 

    <DataTemplate x:Key="DataTemplateB"> 
     <Grid Name="TopGrid"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="auto"/> 
       <RowDefinition Height="*"/> 
      </Grid.RowDefinitions> 
      <StackPanel Orientation="Horizontal"> 
       <TextBox/> 
       <Button Name="DisplayGridButton" Content="Show" Margin="10,0" Click="DisplayGridButton_Click"/> 
      </StackPanel> 
      <Grid Name="DisplayGrid" Grid.Row="1" Visibility="Collapsed"> 
       <StackPanel> 
        <Button Name="HideGridButton" Content="Hide" Click="HideGridButton_Click"/> 
        <ListView Name="SecondListView"> 
         <ListView.ItemTemplate> 
          <DataTemplate > 

          </DataTemplate> 
         </ListView.ItemTemplate> 
        </ListView> 
       </StackPanel> 
      </Grid> 
     </Grid> 
    </DataTemplate> 
</Page.Resources> 

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <ListView Name="MyListView"> 

    </ListView> 
</Grid> 

DataTemplateA 또는 DataTemplateB은 뒤에 코드에서 설정됩니다.

if (condition) 
{ 
    MyListView.ItemTemplate = (DataTemplate)Resources["DataTemplateA"]; 
} 
    else 
{ 
    MyListView.ItemTemplate = (DataTemplate)Resources["DataTemplateB"]; 
} 

코드 뒤에는 이벤트 핸들러를 만들 수 있지만 DisplayGrid에 액세스하여 표시하거나 축소 할 수 없습니다.

나는 일반적으로 이와 같은 가시성을 설정합니다.

private void DisplayGridButton_Click(object sender, RoutedEventArgs e) 
    { 
     DisplayGrid.Visibility = Visibility.Visible; 
    } 

private void HideGridButton_Click(object sender, RoutedEventArgs e) 
    { 
     DisplayGrid.Visibility = Visibility.Collapsed; 
    } 

어떻게하면 단추 클릭 이벤트에서 DataTemplate의 DisplayGrid에 액세스합니까?

답변

0

그리드가 템플릿에 정의되어 있으므로 런타임에이를 찾아야합니다. (당신은 코드 숨김에서 "DisplayGrid"로 참조 할 수 있다면, 당신은 어쨌든에 속한 어떤 목록보기 항목 모르겠다.)

것은이 같은 클릭 핸들러 뭔가 구현 :

private void DisplayGridButton_Click(object sender, RoutedEventArgs e) 
{ 
    Button button = sender as Button; 
    StackPanel stackPanel = button?.Parent as StackPanel; 
    Grid grid = stackPanel?.Parent as Grid; 
    if (grid != null) 
    { 
     Grid displayGrid = FindVisualChild<Grid>(grid, "DisplayGrid"); 
     if (displayGrid != null) 
     { 
      displayGrid.Visibility = Visibility.Visible; 
     } 
    } 
} 

private void HideGridButton_Click(object sender, RoutedEventArgs e) 
{ 
    Button button = sender as Button; 
    StackPanel stackPanel = button?.Parent as StackPanel; 
    Grid grid = stackPanel?.Parent as Grid; 
    if (grid != null) 
    { 
     grid.Visibility = Visibility.Collapsed; 
    } 
} 

(공정 경고 :이 코드가 시작하기에 적절한 부모를 찾는 방법은 약간 부서지기 때문에 템플릿이 변경되면 깨질 수 있습니다. 이름으로 검색하는 것이 좋지만 지금 당장은 편리하지 않습니다.)

여기 있습니다 비주얼 트리에서 명명 된 자식을 찾는 도우미 메서드 :

public static T FindVisualChild<T>(
    DependencyObject parent, 
    string name = null) 
    where T : DependencyObject 
{ 
    if (parent != null) 
    { 
     int childrenCount = VisualTreeHelper.GetChildrenCount(parent); 
     for (int i = 0; i < childrenCount; i++) 
     { 
      DependencyObject child = VisualTreeHelper.GetChild(parent, i); 
      T candidate = child as T; 
      if (candidate != null) 
      { 
       if (name == null) 
       { 
        return candidate; 
       } 

       FrameworkElement element = candidate as FrameworkElement; 
       if (name == element?.Name) 
       { 
        return candidate; 
       } 
      } 

      T childOfChild = FindVisualChild<T>(child, name); 
      if (childOfChild != null) 
      { 
       return childOfChild; 
      } 
     } 
    } 

    return default(T); 
} 

(이 방법은 유형별로도 검색 할 수 있습니다. 이름으로 null을 전달하십시오.)