2009-09-24 108 views
10

我正在使用RowDetails面板的RowDetailsVisibilityMode設置爲「VisibleWhenSelected」和SelectionMode =「Extended」的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的行。

因此,當前滾動關閉它們已打開的RowDetailsPanes。我想要做的是在其中一個列中添加一個複選框,並將RowDetails面板可見性綁定到此屬性,但我無法弄清楚如何執行此操作。問題很簡單,RowDetailsPane只對數據網格中的行選擇操作 - 是否可以以某種方式進行擴展以對我選擇的屬性進行操作?

由於提前, 請問

回答

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

我還沒有探討通過數據綁定做到這一點。

+0

感謝羅裏,很好的解決方案。這正是我想要的,我錯誤地認爲綁定到ViewModel中的一個屬性,因爲這純粹是View功能,所以在複選框的click事件上運行的方法是完美的。 – WillH 2009-09-25 07:48:31

+2

如果您爲初始DataGrid.RowDetailsVisibilityMode =「Collapsed」 – 2010-01-30 05:39:36

9

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

+1,則此方法也適用於Silverlight,因爲它更易於在多個位置應用,並且在移動DataGrid Xaml時更便於攜帶。 – 2013-05-31 15:35:44

+0

當您將RowDetailsVisibilityMode設置爲摺疊時,此工作正常。 – user3260977 2017-03-27 15:38:59

0

如果使用(優秀)LAMBDA轉換器庫,您可以節省額外購買類。該轉換器採用2個lambda表達式,先進行轉換,第二次爲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