Đây là những gì tôi đã kết thúc. Tôi muốn sử dụng một tài sản trên DataGrid cho điều này, nhưng vì không có tài sản như vậy tồn tại tôi cần một workaround.
Đầu tiên tôi chỉ sử dụng ActualWidth từ DataGrid phụ huynh và loại bỏ một hằng số của 9. Điều này làm việc lúc đầu tiên nhưng thất bại khi thanh cuộn dọc trở nên nhìn thấy được vì vậy tôi đã phải sử dụng một 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>
Và trong bộ chuyển đổi, tôi đã sử dụng một hằng số khác (16) để bù cho thanh cuộn dọc có thể nhìn thấy (nếu có thể nhìn thấy).
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;
}
}
Cập nhật
tôi cải thiện trên các giải pháp một chút, sử dụng ActualWidth cho ItemsPresenter thay vì sau đó DataGrid (nơi ActualWidth không thay đổi tùy thuộc vào một ScrollBar nhìn thấy được), do đó loại bỏ các cần cho một MultiConverter và hai hằng số.
<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>
SubtractConstantConverter
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;
}
}
với phiên bản cập nhật của bạn với ItemsPresenter làm tổ tiên thanh cuộn dọc không được tôn trọng. Tôi trừ 22 để tránh thanh cuộn ngang. – user2452157