Высота сетки данных расширяет окно

#c# #wpf #mvvm #datagrid

#c# #wpf #mvvm #сетка данных

Вопрос:

Прямо сейчас у меня есть сетка данных в окне, которая заполняется после нажатия где-нибудь кнопки, всякий раз, когда сетка данных заполняется, она превышает текущий размер окна и расширяет окно дальше. Каков способ убедиться, что сетка данных может расширяться только до текущего размера окна на данный момент?

Мне требуется, чтобы впоследствии размер окна можно было изменять вручную, поэтому установка максимальной высоты невозможна.

     <Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="40" MinHeight="40"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="Auto" MinWidth="250"/>
    </Grid.ColumnDefinitions>

    <GroupBox Grid.Column="0 Margin="10,0,5,0">
        <Grid MaxHeight="{Binding ActualHeight, ElementName= AddressTable}">
            <Grid.RowDefinitions>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions> 
                <DataGrid Name="AddrTable" VerticalScrollBarVisibility="Auto"
                        Grid.Row="0"
  

Комментарии:

1. Не могли бы вы, пожалуйста, опубликовать весь xaml целиком?

Ответ №1:

Я не уверен, что это то, чего вы хотите, но один из способов сделать максимальную высоту динамической с помощью Height окна — это использовать RelativeSource . Позвольте мне объяснить:

В вашем Grid вы устанавливаете MaxHeight значение ActualHeight для окна. Для этого вам просто нужно привязать

 MaxHeigth = "{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=ActualHeight}"
  

Сейчас это не самое лучшее решение из-за того, что внутри окна есть поля, отступы и другие элементы. Итак, что вы хотите, так это сделать Grid пропорциональным ActualHeight . Следовательно, вам нужен конвертер.

Я сделал для вас вот это, которое возвращает процент от значения.

 public class SizePercentageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null) 
            return 0:
        if (parameter == null)
            return (double)value;

        var split = parameter.ToString().Split('.');
        var parameterDouble = double.Parse(split[0])   double.Parse(split[1]) / Math.Pow(10, split[1].Length);
        return (double)value * parameterDouble;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // Don't need to implement this
        return null;
    }
  

После того, как вы определили его в ResourceDictionary

 <converters:SizePercentageConverter x:Key="PercentageConverter" />
  

Вы можете вызвать это в своем MaxHeight . Например, если вы хотели, чтобы она составляла 70% от ActualHeight , вам просто нужно написать

 MaxHeight = "{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=ActualHeight, Converter={StaticResource PercentageConverter}, ConverterParameter=0.7}"
  

В противном случае, если бы вы могли также создать конвертер, который вычитал значение. Например, после привязки она возвращает ActualHeight parameter .

Я надеюсь, что это может помочь, и дайте мне знать, как это происходит.