2015-01-20 3 views
1

WPF에서는 DataGrid 행 머리글에 토글 단추를 사용하여 각 부모 DataGrid 행에 대한 하위 항목을 자식 DataGrid로 자세히 표시합니다. 토글 버튼을 클릭하면 해당 상위 DataGrid 행의 visualstate가 "Checked"상태로 변경됩니다. 제대로 작동하고 있습니다. 그러나 동시에 모든 토글 버튼을 클릭하지 않고 다른 모든 부모 DataGrid 행 시각적 상태의 시각 상태를 "선택 취소"또는 "일반"으로 설정하려고했습니다. 다음 코드를 사용하고 있습니다. 하지만 제대로 작동하지 않습니다. 그러나 각 전환 버튼을 클릭하면 시각 상태가 올바르게 변경됩니다. WPF DataGrid 행 머리글 토글 버튼 Visualstate 코드 뒤에서 변경

private void ToggleButton_Click(object sender, RoutedEventArgs e) 
    {    
      DependencyObject obj = (DependencyObject)e.OriginalSource; 
      while (!(obj is DataGridRow) && (obj != null)) 
      { 
       obj = VisualTreeHelper.GetParent(obj); 
      } 
      if (obj is DataGridRow) 
      { 
      if ((obj as DataGridRow).DetailsVisibility == Visibility.Visible) 
       { 
        (obj as DataGridRow).IsSelected = false; 
        (obj as DataGridRow).DetailsVisibility = System.Windows.Visibility.Collapsed; 
       } 
       else if ((obj as DataGridRow).DetailsVisibility == Visibility.Collapsed) 
       { 
        for (int i = 0; i < Data_Grid.Items.Count; i++) 
        { 
         DataGridRow itm = GetDataGridRowitem(i); 

          itm.IsSelected = false; 
       itm.DetailsVisibility = System.Windows.Visibility.Collapsed;    

       VisualStateManager.GoToElementState(itm, "Unchecked", true); 
        } 
        DataTemplate dt = FindResource("tocchild") as DataTemplate; 
        Data_Grid.RowDetailsTemplate = dt; 
        (obj as DataGridRow).IsSelected = true; 
        (obj as DataGridRow).DetailsVisibility = Visibility.Visible;       
        VisualStateManager.GoToElementState((obj as DataGridRow), "Checked", true); 
       } 
      }} 

또한 나는

VisualStateManager.GoToState((obj as DataGridRow), "Checked", true); 

도움말 나를하시기 바랍니다했습니다. 감사합니다. .

답변

0

내가 값 전환 버튼을 설정하여 그것을 해결은 참과 거짓의 IsChecked. GetTemplateChildByName이

FrameworkElement tb = GetTemplateChildByName(row, "RowHeaderToggleButton"); 
        (tb as ToggleButton).IsChecked = false; 

, 모든

public static FrameworkElement GetTemplateChildByName(DependencyObject parent, string name) 
{ 
    int childnum = VisualTreeHelper.GetChildrenCount(parent); 
    for (int i = 0; i < childnum; i++) 
    { 
     var child = VisualTreeHelper.GetChild(parent, i); 
     if (child is FrameworkElement && 

     ((FrameworkElement)child).Name == name) 
     { 
      return child as FrameworkElement; 
     } 
     else 
     { 
      var s = GetTemplateChildByName(child, name); 
      if (s != null) 
       return s; 
     } 
    } 
    return null; 
} 

감사합니다.

2

<DataGridTemplateColumn CellTemplate="{StaticResource ExpandDetails}" Width="30" /> 

datagrid의 첫 번째 열을 설정하고

<DataTemplate x:Key="ExpandDetails"> 
      <ToggleButton Name="ShowDetails" Height="20" 
           IsChecked="{Binding RelativeSource={RelativeSource AncestorType=DataGridRow}, 
                Path=DetailsVisibility, 
                Converter={StaticResource VisbilityToBooleanConverter}, 
                Mode=TwoWay}" 
           Margin="4" HorizontalAlignment="Right" FlowDirection="LeftToRight" BorderThickness="0" /> 
</DataGridTemplateColumn> 

다음이 시도이

public class VisbilityToBooleanConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return (Visibility)value == Visibility.Visible; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return (bool)value ? Visibility.Visible : Visibility.Collapsed; 
    } 
} 
1

같은 VisbilityToBooleanConverter을 만들 자원이 dataTemplate을 넣어

class VisibilityConverter : IValueConverter 

Change Visual State