11

RowDetailsパネルでWPFDatagridを使用しています。ここでは、RowDetailsVisibilityModeが"VisibleWhenSelected"およびSelectionMode= "Extended"に設定されているため、複数の行を選択して、以下のように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が閉じます。私がやりたいのは、列の1つにチェックボックスを設定し、RowDetailsパネルの可視性をこのプロパティにバインドすることですが、その方法がわかりません。問題は、RowDetailsPaneがデータグリッド内の行選択でのみ動作することです-選択したプロパティで動作するように何らかの方法で拡張できますか?

よろしくお願いします、ウィル

4

3 に答える 3

14

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)
      {
      }
    }

私はデータバインディングを介してこれを行うことを検討していません。

于 2009-09-24T19:15:26.163 に答える
10

純粋な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;
        }
    }
}
于 2012-10-25T17:09:13.587 に答える
0

(優れた)Lambda Convertersライブラリを使用する場合は、余分なクラスを保存できます。このコンバーターは2つのラムダ式を使用します。1つ目はConvert用、2つ目はConvertBack用です。例:

    public static readonly IValueConverter VisibilityToBoolean =
        ValueConverter.Create<Visibility, bool>(
        (e => e.Value == Visibility.Visible),
            (e => e.Value ? Visibility.Visible : Visibility.Collapsed));

その場合、XAMLは次のようになります(このアプローチを使用する場合、StaticResourcesは必要ないことに注意してください)。

     <DataGrid.RowHeaderTemplate>
            <DataTemplate>
                <ToggleButton>
                    <ToggleButton.IsChecked>
                        <Binding RelativeSource="{RelativeSource AncestorType={x:Type DataGridRow}}" Path="DetailsVisibility"
                                 Converter="{x:Static lc40:Converters.VisibilityToBoolean}"/>
                    </ToggleButton.IsChecked>
                </ToggleButton>
            </DataTemplate>
        </DataGrid.RowHeaderTemplate>

ラムダコンバーターはここから入手できます:

https://github.com/michael-damatov/lambda-converters

于 2018-02-06T17:39:41.717 に答える