Quando si utilizza MVVM stiamo smaltire vista (mentre viewmodel persiste).Restore stato ListView MVVM
La mia domanda è come ripristinare ListView
stato durante la creazione di nuova vista il più vicino possibile a uno quando vista è stato eliminato?
ScrollIntoView funziona solo parzialmente. Posso solo scorrere fino a un singolo elemento e può essere in alto o in basso, non c'è controllo su dove apparirà l'elemento nella vista.
Ho multi-selection (e barra di scorrimento orizzontale, ma questo è piuttosto poco importante) e qualcuno può selezionare diversi elementi e forse scorrere ulteriormente (senza modificare la selezione).
Idealmente vincolanti ScrollViewer
di ListView
oggetti da ViewModel farebbe, ma ho paura di cadere sotto problema XY chiedere che direttamente (non so se this è ancora applicabile). Inoltre questo mi sembra essere una cosa molto comune per WPF, ma forse non riesco a formulare query di google correttamente come non riesco a trovare legati ListView
+ ScrollViewer
+ MVVM
combinata.
È possibile?
ho problemi con ScrollIntoView
e data-modelli (MVVM) con piuttosto brutti soluzioni alternative. Ripristinare ListView
stato con ScrollIntoView
suona male. Ci dovrebbe essere un altro modo. Oggi google mi porta alla mia domanda senza risposta.
Sto cercando una soluzione per ripristinare lo stato ListView
. Considerare quanto segue come 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>
Questa è una finestra con ContentControl
cui contenuto è destinato a DataContext
(commutato dal tasto essere o null
o ViewModel
esempio).
Ho aggiunto il supporto IsSelected
(prova a selezionare alcuni elementi, nascondere/mostrare ListView
ripristinerà quello).
Lo scopo è: mostra ListView
, rotolo (è 100x100
dimensioni, in modo che il contenuto è più grande) verticalmente e/o orizzontalmente, pulsante per nascondere clic, premere il pulsante per mostrare e in questo momento ListView
dovrebbe ripristinare lo stato (cioè posizione di ScrollViewer
).
I don vediamo come usare qualsiasi cosa da questa risposta. Vedi modifica, ho aggiunto MCVE, potresti farlo funzionare (ripristino dello stato)? – Sinatr
Aggiornamento la risposta in base al campione. Ho anche capito che c'erano una serie di errori di compilazione nella mia risposta originale - mi scuso per questo. Era scritto nel blocco note, perché non avevo accesso a Visual Studio. Questo è scritto e testato in VS però :) – sondergard
[GetChildOfType] (http://stackoverflow.com/a/10279201/1997232)? – Sinatr