c# - type - wpf table datagrid




WPF Datagrid RowDetailsTemplate 가시성이 속성에 바인딩 됨 (2)

순수 XAML (+ 변환기) 사용 :

XAML :

<DataGrid.RowHeaderTemplate>
    <DataTemplate>
        <ToggleButton
            IsChecked="{Binding Path=DetailsVisibility,
                RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}},
                Converter={StaticResource _VisibilityToNullableBooleanConverter}}"
            />
    </DataTemplate>
</DataGrid.RowHeaderTemplate>

변환기:

public class VisibilityToNullableBooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is Visibility)
        {
            return (((Visibility)value) == Visibility.Visible);
        }
        else
        {
            return Binding.DoNothing;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is bool?)
        {
            return (((bool?)value) == true ? Visibility.Visible : Visibility.Collapsed);
        }
        else if (value is bool)
        {
            return (((bool)value) == true ? Visibility.Visible : Visibility.Collapsed);
        }
        else
        {
            return Binding.DoNothing;
        }
    }
}

RowDetailsVisibilityMode가 "VisibleWhenSelected"로 설정되고 SelectionMode = "Extended"로 설정된 RowDetails 패널에서 WPF Datagrid를 사용하여 여러 행을 선택하고 RowDetails를 아래와 같이 표시 할 수 있습니다.

<dg:DataGrid x:Name="MyGrid"
             ItemsSource="{Binding Path=MyItems}"
             AutoGenerateColumns="True"
             SelectionMode="Extended"
             RowDetailsVisibilityMode="VisibleWhenSelected">

  <dg:DataGrid.RowDetailsTemplate>
    <DataTemplate>
      <TextBlock Text="Further Details..."/>
    </DataTemplate>
  </dg:DataGrid.RowDetailsTemplate>
  ...
</dg:DataGrid>

불행히도이 애플리케이션에서는 '선택한'행에 행 세부 정보를 표시하는 것이 직관적이지 않으므로 클라이언트는 RowDetails 창을 표시하기 위해 여러 행의 확인란을 클릭하고 다른 행을 선택하여 그리드 주변을 스크롤합니다. 즉, DataGrid에서 어떤 일이 발생하더라도 RowDetails를 표시하는 행을 수정하십시오.

그래서 현재 열어 놓은 RowDetailsPanes를 닫습니다. 내가 뭘하고 싶은 하나의 열에 체크 박스를 가지고이 속성에 RowDetails 패널 가시성을 바인딩하는 방법을 알아낼 수 없습니다. 문제는 단순히 RowDetailsPane이 DataGrid의 행 선택에서만 작동한다는 것입니다. 이것은 내가 선택한 속성에서 작동하도록 어떻게 확장 될 수 있습니까?

미리 감사드립니다, 윌


WPF 툴킷 소스 코드를 보면 각 DataGridRow에는 DetailsVisibility 속성이 있습니다.

첫 번째 열에는 테스트 용 버튼을 두었습니다.

<toolkit:DataGridTemplateColumn>
    <toolkit:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Button x:Name="buttonDetails" Content="Hello" ButtonBase.Click="Details_Click" />
        </DataTemplate>
    </toolkit:DataGridTemplateColumn.CellTemplate>
</toolkit:DataGridTemplateColumn>

버튼을 클릭하면 클릭 한 행을 찾아 속성을 토글합니다.

   private void Details_Click(object sender, RoutedEventArgs e)
    {
      try
      {
        // the original source is what was clicked.  For example 
        // a button.
        DependencyObject dep = (DependencyObject)e.OriginalSource;

        // iteratively traverse the visual tree upwards looking for
        // the clicked row.
        while ((dep != null) && !(dep is DataGridRow))
        {
          dep = VisualTreeHelper.GetParent(dep);
        }

        // if we found the clicked row
        if (dep != null && dep is DataGridRow)
        {
          // get the row
          DataGridRow row = (DataGridRow)dep;

          // change the details visibility
          if (row.DetailsVisibility == Visibility.Collapsed)
          {
            row.DetailsVisibility = Visibility.Visible;
          }
          else
          {
            row.DetailsVisibility = Visibility.Collapsed;
          }
        }
      }
      catch (System.Exception)
      {
      }
    }

데이터 바인딩을 통해이를 수행하지는 않았습니다.