这就是我最终做的。我宁愿为此使用 DataGrid 上的属性,但由于不存在这样的属性,我需要一种解决方法。
![替代文字](https://i.stack.imgur.com/7BOYV.png)
首先,我只使用了父 DataGrid 中的 ActualWidth 并删除了一个常量 9。这最初是有效的,但是当垂直滚动条变得可见时失败了,所以我不得不使用 MultiBinding。
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<Border HorizontalAlignment="Left" CornerRadius="5"
BorderBrush="Red" BorderThickness="2" Background="Black">
<Border.Width>
<MultiBinding Converter="{StaticResource RowDetailsWidthMultiConverter}"
ConverterParameter="9">
<Binding RelativeSource="{RelativeSource AncestorType={x:Type DataGrid}}"
Path="ActualWidth"/>
<Binding RelativeSource="{RelativeSource AncestorType={x:Type ScrollViewer}}"
Path="ComputedVerticalScrollBarVisibility"/>
</MultiBinding>
</Border.Width>
<TextBlock Foreground="White" Text="{Binding RowDetails}" TextWrapping="Wrap"/>
</Border>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
在转换器中,我使用了另一个常量 (16) 来补偿可见的垂直滚动条(如果它是可见的)。
public class RowDetailsWidthMultiConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
double originalWidth = (double)values[0];
Visibility verticalScrollbarVisibility = (Visibility)values[1];
double subtractWidth = System.Convert.ToDouble(parameter);
double returnWidth = originalWidth - subtractWidth;
if (verticalScrollbarVisibility == Visibility.Visible)
{
return returnWidth - 16;
}
return returnWidth;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
return null;
}
}
更新
我对解决方案进行了一些改进,对 ItemsPresenter 使用 ActualWidth 而不是 DataGrid(其中 ActualWidth 不会根据可见的 ScrollBar 而改变),因此不再需要 MultiConverter 和两个常量。
<DataGrid.Resources>
<local:SubtractConstantConverter x:Key="SubtractConstantConverter"/>
</DataGrid.Resources>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<Border HorizontalAlignment="Left" CornerRadius="5"
BorderBrush="Red" BorderThickness="2" Background="Black"
Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type ItemsPresenter}},
Path=ActualWidth,
Converter={StaticResource SubtractConstantConverter},
ConverterParameter=6}">
<TextBlock Foreground="White" Text="{Binding RowDetails}" TextWrapping="Wrap"/>
</Border>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
减法常数转换器
public class SubtractConstantConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
double originalValue = (double)value;
double subtractValue = System.Convert.ToDouble(parameter);
return originalValue - subtractValue;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return null;
}
}