#wpf #mvvm #datagrid
#wpf #mvvm #сетка данных
Вопрос:
Хорошо, итак, у меня есть DataGrid (стандартная сетка данных WPF, которая поставляется с .Net 4.0, А НЕ с сеткой данных WPF Toolkit) с canuseraddrow=false . Оно привязано к ObservableCollection в ViewModel. У него правильно установлена максимальная высота, поэтому он будет прокручиваться, если на экране слишком много строк.
Он отлично работает так, как есть, за исключением того факта, что если пользователь наведет курсор мыши на сетку данных, а затем переместит колесо прокрутки вниз, под строками появится дополнительное пространство:
Я бы предпочел, чтобы серое пространство не появлялось в этом случае (там, где нет необходимости прокручивать). Как мне это сделать?
PS Я фактически создал свою собственную функциональность для новой строки в нижней части сетки данных из-за некоторых особых требований к нашей программе, поэтому пустая строка в нижней части сетки данных. Это делается полностью в виртуальной машине, поэтому это не должно повлиять на ответ на этот вопрос.
Обновить:
Такое поведение происходит в каждой сетке данных, которая у меня есть в настоящее время. Однако, когда в сетке данных установлена максимальная высота, а строк больше, чем может отображаться, содержимое начинает прокручиваться. В этой ситуации серое пространство под строками имеет переменный размер. То есть, поскольку сетка данных прокручивается на основе содержимого, а не физической прокрутки (подробнее о различии см. В разделе Примечания), внизу под последней строкой остается немного дополнительного места при прокрутке до самого низа. Серое пространство заполняет это дополнительное пространство. Вот пример:
Чтобы уточнить, я не возражаю против такого поведения, просто когда появляется серое пространство, когда нет необходимости в прокрутке. Я просто подумал, что такое поведение поможет указать причину проблемы.
Обновление # 2:
Я обнаружил, что может вызвать проблему: если вы установите для enablerowirtualization значение false, тогда возникает эта проблема. Однако, если я хочу установить для него значение false, как я могу предотвратить появление серого пространства / «дополнительной строки», когда нет необходимости прокручивать?(это моя главная проблема и основная суть этого вопроса)
Комментарии:
1. На самом деле это происходит на моей машине дома, но не на моей машине на работе. Рад, что я не единственный, кто это видит?
2. Ага. Я заметил, что это немного непостоянно… Хотя обычно я могу добиться, чтобы это произошло в конечном итоге. Не совсем уверен, от чего это зависит…
3. Что, если вы попытаетесь установить сетку данных только для чтения. Это все еще происходит?
4. Хм … после быстрого теста — да, это все еще происходит, когда я устанавливаю IsReadOnly=»True» для сетки данных. Что это означает в данном случае? Я все еще могу редактировать сетку данных, когда устанавливаю это свойство.
5. Я бы попробовал создать простой
List
и назначить егоItemsSource
. Просто чтобы убедиться, что это не имеет ничего общего с ViewModel и его модификациями (возможно, асинхронностью и другими вещами).
Ответ №1:
Попробуйте это: установите
ScrollViewer.CanContentScroll
ДляFalse
ScrollViewer.HorizontalScrollBarVisibility
ДляDisabled
Затем
<DataGrid x:Name="myDataGrid"
RowHeaderWidth="{Binding RelativeSource={RelativeSource Self}, Path=RowHeight}"
ScrollViewer.CanContentScroll="False"
ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Width="*" Binding="{Binding Name}"/>
<DataGridTextColumn Header="Age" Width="*" Binding="{Binding Age}"/>
</DataGrid.Columns>
</DataGrid>
Ответ №2:
Я столкнулся с той же проблемой. В моем случае дополнительное пространство внизу было вызвано тем, что была установлена максимальная высота и из-за
VirtualizingPanel.ScrollUnit="Item"
После установки его в
VirtualizingPanel.ScrollUnit="Pixel"
проблема фактически исчезает (по-прежнему имеет свойство maxHeight)
Ответ №3:
Ваш вопрос немного неясен, но я могу предложить несколько шагов по расследованию, чтобы выяснить, в чем причина.
-
Убедитесь, что ваша наблюдаемая коллекция не содержит никаких нулевых значений. Нулевая запись в коллекции все равно будет отображаться в сетке как пустая строка.
-
Тот факт, что это происходит в разных средах, означает, что ваш источник данных может отличаться, так что это хорошее место для проверки. Проверьте здесь, что количество коллекции напрямую сопоставляется с количеством строк в сетке (включая пустую строку).
-
Убедитесь, что это не проблема с шаблоном управления. Если возможно, посмотрите на
Style
иDataTemplate
для вашегоDataGrid
элемента управления, чтобы увидеть, не является ли это визуальным побочным эффектом.
Кроме того, вам следует включить в свой вопрос более подробную информацию, например, тип DataGrid
используемого вами (например. WPF Toolkit, Telerik, DevExpress и т. Д.), Чтобы мы могли исключить проблему с шаблонами.
Комментарии:
1. Я прояснил вопрос, включая некоторые подробности о сетке данных, которую я использую в начале. Я использую сетку данных WPF .Net 4 (а не сетку данных WPF Toolkit, которая, как я понимаю, немного отличается). В наблюдаемой коллекции явно нет нулевых значений. Количество коллекции напрямую сопоставляется с количеством строк (НЕ ВКЛЮЧАЯ серое пространство, которое, я не уверен, является пустой строкой). И DataTemplate является стандартным от Microsoft — нет ничего очевидного, что было бы неправильно. Надеюсь, это поможет. Спасибо!
Ответ №4:
У меня была такая же проблема, и это было вызвано DataGrid
MaxHeight
тем, что свойство ‘s не было установлено на кратное размеру строки, поэтому оставшееся пространство отображалось в нижней части DataGrid
. Например: если есть 5 строк высотой 10 пикселей, а MaxHeight
свойство установлено в 55, то внизу будет 5 пикселей пространства.
Комментарии:
1. На самом деле: [ dataGridMaxHeight — headerRowHeight % RowHeight == 0 ] . Это должен быть принятый ответ. Решение на самом деле довольно простое, но ваш пост мне очень помог, спасибо.
2. Я также сталкиваюсь с той же проблемой. В сетке данных слишком много неиспользуемого пространства.
Ответ №5:
Я почему-то предполагаю, что это может быть связано с тем, что эта сетка данных должна отображать первую видимую строку на границе строки, например. он не может отображать только нижнюю половину первой видимой строки, чтобы последняя строка совпадала с нижней частью элемента управления.
Вы можете проверить это двумя шагами: 1) прокрутите до нижней части вашей сетки данных и увидите дополнительное серое пространство; 2) медленно измените размер сетки данных (или содержащего ее окна) по вертикали и посмотрите, как изменяется это серое пространство, отметив при этом, что первая видимая строка остается неизменной.
Ответ №6:
У меня была похожая проблема, и ответ прост. Все, что вам нужно сделать, это поместить следующее в определение сетки данных в XAML:
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding ItemList}"
CanUserAddRows="false"
и все ясно.
Еще одна похожая вещь: если вы получаете пустой столбец в своей таблице данных, тогда решение состоит в том, чтобы поместить Width=»*» в ваше последнее определение столбца также в XAML.
Надеюсь, это сработает для вас.
Комментарии:
1. -1: автор четко указал, что он / она уже есть
CanUserAddRows="false"
.
Ответ №7:
Set ScrollViewer.CanContentScroll="False" amp; ScrollViewer.HorizontalScrollBarVisibility="Disabled" in DataGrid.
Ответ №8:
установите оба ScrollViewer.CanContentScroll
и CanUserAddRows
на false
.