首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataGrid RowDetails宽度问题

DataGrid RowDetails宽度问题
EN

Stack Overflow用户
提问于 2010-11-18 00:05:30
回答 6查看 9.3K关注 0票数 13

假设我有一个DataGrid,定义如下

代码语言:javascript
复制
<DataGrid AreRowDetailsFrozen="True"
          ItemsSource="{Binding MyCollection}"
          AutoGenerateColumns="False">
    <DataGrid.RowDetailsTemplate>
        <DataTemplate>
            <Border CornerRadius="5" BorderBrush="Red"
                    BorderThickness="2" Background="Black">
                <TextBlock Foreground="White" Text="{Binding RowDetails}"
                           TextWrapping="Wrap"/>
            </Border>
        </DataTemplate>
    </DataGrid.RowDetailsTemplate>
    <DataGrid.Columns>
        <DataGridTextColumn Header="0" Binding="{Binding Value1}"/>
        <DataGridTextColumn Header="1" Binding="{Binding Value2}"/>
        <DataGridTextColumn Header="2" Binding="{Binding Value3}"/>
        <DataGridTextColumn Header="3" Binding="{Binding Value4}"/>
    </DataGrid.Columns>
</DataGrid>

不管有没有RowDetails,看起来都是这样

在右边的图片中,我得到了一个非常长的DataGridRow,它从不包装。

是否可以让RowDetails使用与DataGrid相同的宽度而不影响宽度本身?

我试过的东西能达到包装,但不是令人满意的。

  • 在边框或TextBlock上设置宽度或MaxWidth。不太动态。
  • 在DataGrid上设置了DataGrid。当列不适合时,情况不太好。
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-11-18 15:08:13

这就是我最后要做的。为此,我宁愿在DataGrid上使用一个属性,但是由于不存在这样的属性,我需要一个解决办法。

首先,我从父ActualWidth中使用了DataGrid,删除了一个常量9,但当垂直滚动条变得可见时,它开始工作了,但是失败了,所以我不得不使用MultiBinding。

代码语言:javascript
复制
<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)来补偿一个可见的垂直滚动条(如果它是可见的)。

代码语言:javascript
复制
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;
    }
}

更新

我对解决方案做了一些改进,将ActualWidth用于ItemsPresenter而不是DataGrid ( ActualWidth不依赖于可见的ScrollBar),从而消除了对MultiConverter和两个常量的需求。

代码语言:javascript
复制
<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

代码语言:javascript
复制
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;
    }
}
票数 14
EN

Stack Overflow用户

发布于 2011-10-21 09:42:54

这里的答案就像是一个解决办法,所以我做了一些研究,并在Telerik论坛上找到了解决方案,因为我们使用了他们的RadGridView。结果,该解决方案也适用于DataGrid。

关键是将ScrollViewer.HorizontalScrollBarVisibility属性设置为“禁用”,参见下面的示例。

代码语言:javascript
复制
<DataGrid ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<DataGrid.RowDetailsTemplate>
    <DataTemplate>
        <Border>
            <TextBlock Foreground="White" Text="{Binding RowDetails}"
                       TextWrapping="Wrap"/>
        </Border>
    </DataTemplate>
</DataGrid.RowDetailsTemplate>

编辑:一个副作用是,如果列需要更多的空间水平比有空间,因为他们将被剪裁。因此,如果这是一个问题,那么这个解决方案就不是最优的。

票数 16
EN

Stack Overflow用户

发布于 2015-05-18 09:19:58

这就是我最后所做的工作:将行详细信息宽度绑定到其演示程序的实际宽度,然后添加一个不同厚度的边框,以弥补演示程序中存在/没有垂直滚动条的情况。这种方法对我来说非常有效。样本xaml:

代码语言:javascript
复制
<DataGrid.RowDetailsTemplate>
     <DataTemplate>
        <Border BorderThickness="2,2,8,2"
                Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type ItemsPresenter}}, Path=ActualWidth}"
                HorizontalAlignment="Left" >
           <!-- add the row details view contents here -->
         </Border>
     </DataTemplate>
</DataGrid.RowDetailsTemplate>
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4210480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档