WPF Datagrid RowDetailsTemplate绑定到属性的可见性

我正在使用带有RowDetails面板的WPF Datagrid,其中RowDetailsVisibilityMode设置为“VisibleWhenSelected”,SelectionMode =“Extended”,以便可以选择多行,从而显示RowDetails,如下所示:

      ...  

遗憾的是,对于此应用程序,在“选定”行上显示行详细信息并不直观,客户端希望单击多行上的复选框以显示RowDetails窗格,还可以在网格中滚动选择其他行。 换句话说,无论DataGrid上发生什么,都要修复显示RowDetails的行。

因此,目前滚动关闭他们已打开的RowDetailsPanes。 我想要做的是在其中一个列中有一个复选框,并将RowDetails面板可见性绑定到此属性,但我无法弄清楚如何执行此操作。 问题只是RowDetailsPane只对数据网格中的行选择进行操作 – 它能以某种方式扩展以对我选择的属性进行操作吗?

先谢谢,威尔

查看WPF工具包源代码,每个DataGridRow都有一个DetailsVisibility属性。

我在第一列中放了一个按钮(仅用于测试)。

        

单击该按钮时,找到单击的行并切换属性。

  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(+转换器):

XAML:

      

转换器:

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

如果您使用(优秀)Lambda转换器库,您可以保存额外的类。 此转换器使用2个lambda表达式,第一个用于Convert,第二个用于ConvertBack,例如:

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

然后XAML如下(注意使用这种方法时不需要StaticResources):

           

Lambda转换器可在此处获得:

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