При использовании MVVM мы располагаем представлением (в то время как режим просмотра сохраняется).Восстановить состояние ListView MVVM
Мой вопрос в том, как восстановить состояние ListView
при создании нового вида как можно ближе к одному при отображении вида?
ScrollIntoView работает только частично. Я могу только прокрутить до одного элемента, и он может быть сверху или снизу, нет контроля над тем, где элемент будет отображаться в представлении.
У меня есть multi-selection (и горизонтальная полоса прокрутки, но это неважно), и кто-то может выбрать несколько элементов и, возможно, прокрутить дальше (без изменения выбора).
В идеале связывание ScrollViewer
из ListView
свойств ViewModel будет делать, но я боюсь, чтобы подпадать под проблемой XY просить, что непосредственно (не уверен, что если this даже применимо). Кроме того, мне кажется, что это очень распространенная проблема для wpf, но, возможно, я не могу правильно сформулировать запрос Google, поскольку не могу найти связанный ListView
+ ScrollViewer
+ MVVM
комбо.
Возможно ли это?
У меня есть проблемы с ScrollIntoView
и данными-шаблонами (MVVM) с довольно уродливыми обходными путями. Восстановление ListView
состояние с ScrollIntoView
звучит неправильно. Должен быть другой путь. Сегодня google приводит меня к моему собственному неотвеченному вопросу.
Я ищу решение для восстановления ListView
состояние. Рассмотрим следующий как mcve:
public class ViewModel
{
public class Item
{
public string Text { get; set; }
public bool IsSelected { get; set; }
public static implicit operator Item(string text) => new Item() { Text = text };
}
public ObservableCollection<Item> Items { get; } = new ObservableCollection<Item>
{
"Item 1",
"Item 2",
"Item 3 long enough to use horizontal scroll",
"Item 4",
"Item 5",
new Item {Text = "Item 6", IsSelected = true }, // select something
"Item 7",
"Item 8",
"Item 9",
};
}
public partial class MainWindow : Window
{
ViewModel _vm = new ViewModel();
public MainWindow()
{
InitializeComponent();
}
void Button_Click(object sender, RoutedEventArgs e) => DataContext = DataContext == null ? _vm : null;
}
XAML:
<StackPanel>
<ContentControl Content="{Binding}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type local:ViewModel}">
<ListView Width="100" Height="100" ItemsSource="{Binding Items}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Text}" />
</DataTemplate>
</ListView.ItemTemplate>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="IsSelected" Value="{Binding IsSelected}" />
</Style>
</ListView.ItemContainerStyle>
</ListView>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
<Button Content="Click"
Click="Button_Click" />
</StackPanel>
Это окно с ContentControl
, содержание которых связан с DataContext
(переключается с помощью кнопки, чтобы быть либо null
или ViewModel
экземпляр).
Я добавил IsSelected
поддержка (попробуйте выбрать некоторые элементы, скрытие/показ ListView
восстановит это).
Цели является: показать ListView
, свиток (это 100x100
размера, так что содержание больше) по вертикали и/или горизонтали, нажмите кнопку, чтобы скрыть, нажмите кнопку, чтобы показать и в это время ListView
должна восстановить свое состояние (а именно положение от ScrollViewer
).
Я не Посмотрите, как использовать что-либо из этого ответа. См. Edit, я добавил MCVE, вы могли бы заставить его работать (восстановление состояния)? – Sinatr
Я обновляю ответ в соответствии с вашим образцом. Я также понял, что в моем первоначальном ответе была куча ошибок компиляции - я прошу прощения за это. Это было написано в блокноте, поскольку у меня не было доступа к Visual Studio. Это написано и протестировано в VS, хотя :) – sondergard
[GetChildOfType] (http://stackoverflow.com/a/10279201/1997232)? – Sinatr