13

このように定義されたDataGridがあるとします。

<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と同じ幅を使用し、幅自体に影響を与えないようにすることは可能ですか?

ラッピングを達成するが満足のいく方法ではない私が試したこと

  • BorderまたはTextBlockにWidthまたはMaxWidthを設定します。あまり動的ではありません。
  • DataGridでScrollViewer.Horizo​​ntalScrollBarVisibility="Disabled"を設定します。柱が合わないときはあまり良くありません。
4

6 に答える 6

15

ここでの回答は回避策のように感じたので、RadGridViewを使用しているので、Telerikフォーラムで調査を行い、解決策を見つけました。このソリューションはDataGridでも機能することが判明しました。

重要なのは、ScrollViewer.Horizo​​ntalScrollBarVisibilityプロパティをDisabledに設定することです。以下の例を参照してください。

<DataGrid ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<DataGrid.RowDetailsTemplate>
    <DataTemplate>
        <Border>
            <TextBlock Foreground="White" Text="{Binding RowDetails}"
                       TextWrapping="Wrap"/>
        </Border>
    </DataTemplate>
</DataGrid.RowDetailsTemplate>

編集:副作用は、列がクリップされる余地があるよりも水平方向により多くのスペースを必要とする場合です。したがって、これが問題である場合、このソリューションは最適ではありません。

于 2011-10-21T09:42:54.663 に答える
14

これが私がやったことです。これにはDataGridのプロパティを使用したいのですが、そのようなプロパティが存在しないため、回避策が必要でした。

代替テキスト

最初に、親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;
    }
}

アップデート

DataGridではなくItemsPresenterにActualWidthを使用して(ActualWidthは表示されているScrollBarに応じて変化しませんでした)、ソリューションを少し改善しました。これにより、MultiConverterと2つの定数が不要になりました。

<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;
    }
}
于 2010-11-18T15:08:13.490 に答える
4

これが私がやったことです。行の詳細の幅をプレゼンターの実際の幅にバインドし、プレゼンターの垂直スクロールバーの有無を補正するためにさまざまな太さの境界線を追加しました。このアプローチは私にとって完璧に機能しました。サンプルxaml:

<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>
于 2015-05-18T09:19:58.657 に答える
2

MaxWidthをElementName=PART_ColumnHeadersPresenter, Path=ActualWidthRenderSize.Widthにバインドできる場合があります。これは、列を表示するDataGridテンプレートの一部であるため、理論的には機能するはずです。

于 2010-11-18T14:07:34.187 に答える
2

Meleakに感謝します、あなたの解決策は私にとってうまくいきました。私たちWPF初心者のための1つの小さな追加。Binding式で参照できるように、Converterクラスをリソースとして宣言してください。

私は次のようにApp.Xamlに私のものを入れました:

<Application x:Class="ISCBilling.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:conv="clr-namespace:my.application.namespace"
             StartupUri="IscBillingWindow.xaml">
    <Application.Resources>

        <conv:RowDetailsWidthMultiConverter x:Key="RowDetailsWidthMultiConverter" />

    </Application.Resources>
</Application>
于 2010-12-29T19:00:48.693 に答える
1

他の人々を救うために、頭を悩ませたり、試行錯誤したりする時間を節約します。

Fredrik Hedbladの最新(1/1/11)のソリューションにしばらく悩まされた後、ConverterParameterの値は6+ [左マージン}+[右マージン](つまり、テンプレートの最も外側のコンテナーのマージン)である必要があることがわかりました。スクリーンショットの拡大を調べた後、6は各行の左側にある垂直バーの幅であると思います。

于 2011-06-15T23:46:58.633 に答える