2009-09-24 30 views
10

RowDetailsVisibilityModeが "VisibleWhenSelected"に設定され、SelectionMode = "Extended"に設定されたRowDetailsパネルでWPF Datagridを使用しているため、複数の行を選択してRowDetailsを以下:WPF Datagrid RowDetailsTemplateプロパティにバインドされた可視性

<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を表示する行を修正します。

現在、周囲をスクロールすると、開いているRowDetailsPaneが閉じられます。私がしたいのは、列の1つにチェックボックスを入れ、このプロパティにRowDetailsパネルの可視性をバインドすることですが、その方法を理解できません。問題は、単にRowDetailsPaneがデータグリッドの行選択に対してのみ動作することです。選択したプロパティで動作するように拡張できますか?事前に

おかげで、 ウィル

答えて

14

各DataGridRowがDetailsVisibilityプロパティを持つWPFツールキットのソースコードを見てみます。

私は最初の列にボタン(テスト用)を入れました。

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

私はこれをデータバインディングで調べていません。純粋なXAML(+コンバータ)を使用して

+0

おかげロリー、素敵なソリューション。これはまさに私が欲しかったことです。私はViewModelのプロパティへのバインディングに関して考えるのは間違っていました。これは、単にViewの機能であるため、チェックボックスのclickイベントで動作するメソッドは完璧です。 – WillH

+2

DataGrid Xamlを移動するときに複数の場所に適用する方が簡単で移植性が高いため、Xamlのみのアプローチでは、最初のDataGrid.RowDetailsVisibilityMode = "Collapsed" –

9

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; 
     } 
    } 
} 
+3

+1を設定すると、これはSilverlightでも機能します。 –

+0

これは、RowDetailsVisibilityModeをCollapsedに設定するとうまく機能します。 – user3260977

0

あなたは(優秀)ラムダコンバータライブラリを使用する場合は、余分を保存することができますクラス。このコンバータは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

関連する問題