Wenn MVVM verwendet wird, wird die Ansicht entfernt (solange Viewmodel beibehalten wird).Restore ListView-Status MVVM
Meine Frage ist, wie ListView
Zustand wiederherzustellen, wenn neue Ansicht so nah wie möglich zu einer, wenn Ansicht wurde entsorgt erstellt?
ScrollIntoView funktioniert nur teilweise. Ich kann nur zu einem einzelnen Bild blättern und es kann oben oder unten sein, es gibt keine Kontrolle darüber, wo das Element in der Ansicht angezeigt wird.
Ich habe multi-selection (und horizontale Bildlaufleiste, aber das ist eher unwichtig) und jemand kann mehrere Elemente auswählen und vielleicht weiter scrollen (ohne Auswahl zu ändern).
Idealer Bindung ScrollViewer
von ListView
Eigenschaften tun würde, zu Ansichtsmodell, aber ich habe Angst, unter XY Problem für die direkt fragen zu fallen (nicht sicher, ob this auch anwendbar ist). Darüber hinaus scheint mir dies eine sehr häufige Sache für wpf, aber vielleicht schaffe ich es, google query richtig zu formulieren, da ich keine verwandten ListView
+ ScrollViewer
+ MVVM
Combo finden kann.
Ist das möglich?
Ich habe Probleme mit ScrollIntoView
und Daten-Vorlagen (MVVM) mit ziemlich hässlich Abhilfen. Wiederherstellen ListView
Zustand mit ScrollIntoView
klingt falsch. Es sollte einen anderen Weg geben. Heute führt mich Google zu meiner eigenen unbeantworteten Frage.
Ich bin auf der Suche nach einer Lösung zur Wiederherstellung ListView
Zustand. Betrachten folgenden als 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>
Dies ist ein Fenster mit ContentControl
die Inhalte DataContext
(getoggelt durch Taste entweder null
oder ViewModel
Instanz zu sein) gebunden ist.
Ich habe hinzugefügt IsSelected
Unterstützung (versuchen Sie, einige Elemente auszuwählen, versteckt/zeigt ListView
wird das wiederherstellen).
Ziel ist: Show ListView
, rollt (es ist 100x100
Größe, so dass der Inhalt größer ist) vertikal und/oder horizontal, Schaltfläche klicken, um zu verbergen, klicken um zu zeigen, und zu diesem Zeitpunkt ListView
sollte seinen Zustand wiederherstellen (nämlich Position von ScrollViewer
).
I don nicht sehen, wie man irgendetwas von dieser Antwort benutzt. Siehe Bearbeiten, ich habe MCVE hinzugefügt. Könnten Sie es zum Laufen bringen (Wiederherstellungsstatus)? – Sinatr
Ich aktualisiere die Antwort entsprechend Ihrer Probe. Ich erkannte auch, dass in meiner ursprünglichen Antwort einige Kompilierungsfehler auftraten - dafür entschuldige ich mich. Es wurde in Notepad geschrieben, da ich keinen Zugriff auf Visual Studio hatte. Dieser ist geschrieben und getestet in VS obwohl :) – sondergard
[GetChildOfType] (http://stackoverflow.com/a/10279201/1997232)? – Sinatr