Es scheint im erweiterten Auswahlmodus IsSelected
Bindung ist fehlerhaft. Sieht so aus, als ob nur das letzte Objekt aus der Auswahl außerhalb des Gültigkeitsbereichs korrekt behandelt wird.Erweiterter Auswahlmodus, Virtualisierung und IsSelected Bindung
Demonstration:
Artikel 0
, 1
, 2
und 98
, 97
, 96
mit Steuerung ausgewählt. Bei Auswahl von 94
(ohne Steuerung!) Sollte der Auswahlzähler 1
sein, aber Sie sehen stattdessen 3
. Beim Scrollen wird angezeigt, dass nur ein (letzter) Auswahlpunkt außerhalb des Bereichs nicht ausgewählt wurde.
Unten ist MCVE:
XAML:
<ListBox ItemsSource="{Binding Items}" SelectionMode="Extended" SelectionChanged="ListBox_SelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Text}" />
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsSelected" Value="{Binding IsSelected}" />
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
cs:
public class NotifyPropertyChanged : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string property = "") => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
public class Item : NotifyPropertyChanged
{
bool _isSelected;
public bool IsSelected
{
get { return _isSelected; }
set { _isSelected = value; }
}
public string Text { get; set; }
}
public class ViewModel : NotifyPropertyChanged
{
public ObservableCollection<Item> Items { get; }
public ViewModel()
{
var list = new List<Item>();
for (int i = 0; i < 100; i++)
list.Add(new Item() { Text = i.ToString() });
Items = new ObservableCollection<Item>(list);
}
}
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ViewModel();
}
void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
Title = ((ViewModel)DataContext).Items.Count(item => item.IsSelected).ToString();
}
}
Eine schnelle Lösung ist Listensteuerung (ListBox
oder ListView
) Virtualisierung deaktivieren:
VirtualizingStackPanel.IsVirtualizing="False"
Frage: Gibt es eine Idee, wie Sie es beheben können, ohne die Virtualisierung zu deaktivieren?
Ich vermute, die „ausgewählt“ Aspekt der Elemente ist etwas, das Sie brauchen, um sich zu tun, wenn Virtualisierung ist aktiviert. Virtualisierung (zumindest von nativem Windows betroffen) dient lediglich dazu, Hinweise darauf zu geben, was angezeigt werden soll, anstatt es für Sie anzuzeigen. Es funktioniert in Verbindung mit der Bildlaufleiste. Auf diese Weise kann Ihre App 1000 Objekte anzeigen. Die Anzahl der sichtbaren Objekte bleibt im Allgemeinen konstant (außer auf der letzten Seite oder wenn die Anzahl der Elemente geringer ist als normalerweise auf dem Bildschirm angezeigt würde). – MickyD
Es sieht so aus, als wäre der Visualisierungsmodus auf recycle eingestellt, so dass das ausgewählte Objekt wieder verwendet wird. Haben Sie versucht, den Virtualisierungsmodus zu ändern, wie zum Beispiel: 'VirtualizingPanel.VirtualizationMode =" Standard "'? – XAMlMAX
@XAMlMAX, können Sie mcve kopieren und versuchen Sie es selbst, vielleicht finden Sie eine Lösung. 'VirtualizingMode =" Standard "' verbessert nichts (versucht mit 'VirtualizingPanel' und' VirtualizingStackPanel'). – Sinatr