Имеется ListView
следующего вида:
<ListView ItemsSource="{Binding ListItems}" Grid.Row="1"
SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ScrollViewer.VerticalScrollBarVisibility="Auto" >
<ListView.ItemTemplate>
<DataTemplate>
<!-- шаблон в виде прямоугольника с картинкой и текстом -->
</DataTemplate>
</ListView.ItemTemplate>
<ListView.ItemContainerStyle>
<!-- покраска -->
</ListView.ItemContainerStyle>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
ListView
помещён в Grid
, высота строки "*"
.
Проблема заключается в том, что когда элементов становится достаточно много, VerticalScrollBar
не появляются, и новые элементы продолжают вертикально растягивать ListView
.
Пробовал отключать HorizontalScrollBarVisibility
, помещать ListView
в ScrollViewer
- не помогает. Если добавить MaxHeight="{Binding ListHeight}"
- работает, но при растягивании окна ListView
остаётся того же размера, что и был (нужно, чтобы оно растягивалось).
Вопрос: как заставить появиться вертикальную прокрутку?
Нашёл (в определённой степени довольно корявое) решение:
В ViewModel
к этому UserControl
добавил следующее:
// в конструктор
Application.Current.Windows[0].SizeChanged += new SizeChangedEventHandler(Window_SizeChanged);
// свойство, к которому привязан MaxHeight
public int ListHeight
{
get
{
return (int)Application.Current.Windows[0].ActualHeight - _restHeight;
}
}
// принуждение ListHeight к обновлению
private void Window_SizeChanged(object sender, System.Windows.SizeChangedEventArgs e)
{
NotifyPropertyChanged("ListHeight");
}
Для достижения аналогичной цели я задавал такой ItemsPanelTemplate
в ListView.ItemsPanel
<ListView.ItemsPanel >
<ItemsPanelTemplate>
<WrapPanel
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
HorizontalAlignment="Stretch"
Orientation="Horizontal"
Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type ListView}}, Path=ActualWidth}"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
UPD:
Обратите внимания на свойство Width
в WrapPanel
оно привязывается к свойству ActualWidth
в ListView
. При изменении размера ListView
будет меняться размер WrapPanel
.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Например, из вне приходит какой-то объект неизвестного типа
У стандартного ComboBox есть свойство SelectedValue, которое можно привести к привязанному типу и получить значение из поля, которое не отображается...