web-dev-qa-db-ja.com

WPFデータグリッド-スクロールバーが表示されない

私のDatagridにはObservableCollectionに対するバインディングがあり、EFによってフェッチされたいくつかの値をグループ化した後に埋められます。

私の問題は、datagrid-heightがウィンドウサイズを超えて大きくなることです。誰かがそれを修正する方法を知っていますか...私は死ぬまでググった..:o

<UserControl x:Class="UltranizerV2.Views.Storage.InventoryList"
             xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.Microsoft.com/expression/blend/2008" 
             mc:Ignorable="d">
    <Grid>
        <Grid.RowDefinitions>

            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="25"></RowDefinition>
        </Grid.RowDefinitions>


        <DockPanel  Grid.Row="0" >
            <DataGrid ItemsSource="{Binding PresentableInventoryItems}" VerticalAlignment="Stretch" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Produkttitel" Width="350" Binding="{ Binding ProductTitle}"/>
                <DataGridTextColumn Header="Sku" Width="100" Binding="{ Binding Sku}" />
                <DataGridTextColumn Header="Menge" Width="60"  Binding="{ Binding Quantity}" />
            </DataGrid.Columns>    
            </DataGrid>
        </DockPanel>
        <Label Grid.Row="1">Arsch</Label>
        </Grid>

</UserControl>
15
Erik Mandke

コメントを要約すると、コントロールは問題なく表示され、問題がビジュアルツリーのどこかにあることを示唆しています。 InventoryList、またはその親の1つである可能性が高いため、StackPanelScrollViewer、またはCanvasのように、子が無限に成長できるように制御されます。 。そのため、DataGridはすべての項目に対応できるように拡大できるため、スクロールバーは表示されません。

そのコントロールを削除するか、その子のサイズを制限するコントロールで置き換えます

21
dkozl

データグリッドでプロパティを設定する

<DataGrid AutoGenerateColumns="False" Grid.Column="0" Grid.Row="0"
      ScrollViewer.CanContentScroll="True" 
      ScrollViewer.VerticalScrollBarVisibility="Auto"
      ScrollViewer.HorizontalScrollBarVisibility="Auto">
</DataGrid>
4
Dhru 'soni

次のようにスクロールビューアを使用できます

  <ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto">
    <DataGrid ItemsSource="{Binding PresentableInventoryItems}" VerticalAlignment="Stretch" AutoGenerateColumns="False" Height="500">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Produkttitel" Width="350" Binding="{ Binding ProductTitle}"/>
                <DataGridTextColumn Header="Sku" Width="100" Binding="{ Binding Sku}" />
                <DataGridTextColumn Header="Menge" Width="60"  Binding="{ Binding Quantity}" />
            </DataGrid.Columns>    
            </DataGrid>
</ScrollViewer>

Datagridの高さを定義した場合、スクロールバーが表示されます。

enter image description here

4
Dhaval Patel

これが最良の答えです。その理由を説明します。

  1. DataGridの特別なプロパティを使用する必要がありますScrollViewer
ScrollViewer.CanContentScroll="True" 
ScrollViewer.VerticalScrollBarVisibility="Auto"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
  1. DataGridの親に動的にHeightを調整する必要があります。

    Height = "{Binding ElementName = parentElementName、Path = ActualHeight}"

これは私のコードの実際の例です。

 <Grid x:Name="gridClientsContainer">
     <DataGrid  x:Name="dgClients"  IsReadOnly="True" CanUserAddRows="False" SelectionMode="Single"    VerticalAlignment="Top"        Margin="0 0 0 0" AutoGenerateColumns="False" ItemsSource="{Binding ClientItems}"  RowHeaderWidth="0"    ScrollViewer.CanContentScroll="True" 
      ScrollViewer.VerticalScrollBarVisibility="Auto" 
ScrollViewer.HorizontalScrollBarVisibility="Auto" Height="{Binding ElementName=gridClientsContainer, Path=ActualHeight}">
       <DataGrid.Columns>
          <DataGridTextColumn Binding="{Binding LastName}" Header="Last Name" MinWidth="120" />
          <DataGridTextColumn Binding="{Binding FirstName}" Header="First Name" MinWidth="100" />
     </DataGrid.Columns>
  </DataGrid>
</Grid>
1
Developer