Виртуализация данных влияет на выбор элементов
У меня есть сетка данных, которая показывает большое количество данных, поэтому я включаю виртуализацию. В моей сетке у меня также есть столбец флажка, который является двухсторонним для свойства IsSelected моей модели представления. Когда я пытался выбрать все, все элементы выбраны. Когда я выбрал одну строку, эта строка является единственной, выбранной в видимой области. Но когда я прокручиваю вниз, другие элементы все еще выбраны. Желаемое поведение должно быть выбранная строка должна быть единственным выбранным элементом в сетке. Я думаю, что виртуализация не справляется с этим сценарием. Как я могу решить эту проблему?
Вот мой код:
Посмотреть
<Window x:Class="TestSelection.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:testSelection="clr-namespace:TestSelection"
Title="MainWindow" Height="500" Width="200">
<Window.DataContext>
<testSelection:ViewModel/>
</Window.DataContext>
<Window.Resources>
<DataTemplate x:Key="CheckBoxRowHeaderCell">
<Grid>
<CheckBox IsChecked="{Binding Path=DataContext.IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}}"/>
</Grid>
</DataTemplate>
</Window.Resources>
<DataGrid ItemsSource="{Binding Items}"
RowHeight="20" MaxHeight="500" Width="Auto" ColumnWidth="*"
AutoGenerateColumns="False" IsReadOnly="True"
SelectionMode="Extended" SelectionUnit="FullRow"
CanUserResizeRows="False"
HeadersVisibility="All"
EnableRowVirtualization="True"
VirtualizingStackPanel.VirtualizationMode ="Standard"
VirtualizingStackPanel.IsVirtualizing ="True"
RowHeaderTemplate="{DynamicResource CheckBoxRowHeaderCell}">
<DataGrid.ItemContainerStyle>
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
</Style>
</DataGrid.ItemContainerStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
</DataGrid.Columns>
</DataGrid>
</Window>
модель
public class SampleItem : INotifyPropertyChanged
{
private bool p1;
private string p2;
public SampleItem(bool p1, string p2)
{
IsSelected = p1;
Name = p2;
}
public event PropertyChangedEventHandler PropertyChanged;
protected void RaiseNotifyPropertyChanged(string property)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(property));
}
}
private bool isSelected = false;
/// <summary>
/// Sets and gets the IsSelected property.
/// Changes to that property's value raise the PropertyChanged event.
/// </summary>
public bool IsSelected
{
get
{
return isSelected;
}
set
{
if (isSelected == value)
{
return;
}
isSelected = value;
RaiseNotifyPropertyChanged("IsSelected");
}
}
private string name = string.Empty;
/// <summary>
/// Sets and gets the Name property.
/// Changes to that property's value raise the PropertyChanged event.
/// </summary>
public string Name
{
get
{
return name;
}
set
{
if (name == value)
{
return;
}
name = value;
RaiseNotifyPropertyChanged("Name");
}
}
}
ViewModel
public class ViewModel : INotifyPropertyChanged
{
public ObservableCollection<SampleItem> Items
{
get
{
return new ObservableCollection<SampleItem>()
{
new SampleItem(true, "1"), new SampleItem(true, "2"), new SampleItem(true, "3"), new SampleItem(true, "4"),
new SampleItem(true, "4"), new SampleItem(true, "5"), new SampleItem(true, "6"), new SampleItem(true, "7"),
new SampleItem(true, "1"), new SampleItem(true, "2"), new SampleItem(true, "3"), new SampleItem(true, "4"),
new SampleItem(true, "4"), new SampleItem(true, "5"), new SampleItem(true, "6"), new SampleItem(true, "7"),
new SampleItem(true, "1"), new SampleItem(true, "2"), new SampleItem(true, "3"), new SampleItem(true, "4"),
new SampleItem(true, "4"), new SampleItem(true, "5"), new SampleItem(true, "6"), new SampleItem(true, "7"),
new SampleItem(true, "1"), new SampleItem(true, "2"), new SampleItem(true, "3"), new SampleItem(true, "4"),
new SampleItem(true, "4"), new SampleItem(true, "5"), new SampleItem(true, "6"), new SampleItem(true, "7"),
new SampleItem(true, "1"), new SampleItem(true, "2"), new SampleItem(true, "3"), new SampleItem(true, "4"),
new SampleItem(true, "4"), new SampleItem(true, "5"), new SampleItem(true, "6"), new SampleItem(true, "7"),
new SampleItem(true, "1"), new SampleItem(true, "2"), new SampleItem(true, "3"), new SampleItem(true, "4"),
new SampleItem(true, "4"), new SampleItem(true, "5"), new SampleItem(true, "6"), new SampleItem(true, "7"),
new SampleItem(true, "1"), new SampleItem(true, "2"), new SampleItem(true, "3"), new SampleItem(true, "4"),
new SampleItem(true, "4"), new SampleItem(true, "5"), new SampleItem(true, "6"), new SampleItem(true, "7"),
new SampleItem(true, "1"), new SampleItem(true, "2"), new SampleItem(true, "3"), new SampleItem(true, "4"),
new SampleItem(true, "4"), new SampleItem(true, "5"), new SampleItem(true, "6"), new SampleItem(true, "7"),
new SampleItem(true, "1"), new SampleItem(true, "2"), new SampleItem(true, "3"), new SampleItem(true, "4"),
new SampleItem(true, "4"), new SampleItem(true, "5"), new SampleItem(true, "6"), new SampleItem(true, "7"),
new SampleItem(true, "1"), new SampleItem(true, "2"), new SampleItem(true, "3"), new SampleItem(true, "4"),
new SampleItem(true, "4"), new SampleItem(true, "5"), new SampleItem(true, "6"), new SampleItem(true, "7"),
new SampleItem(true, "1"), new SampleItem(true, "2"), new SampleItem(true, "3"), new SampleItem(true, "4"),
new SampleItem(true, "4"), new SampleItem(true, "5"), new SampleItem(true, "6"), new SampleItem(true, "7"),
new SampleItem(true, "1"), new SampleItem(true, "2"), new SampleItem(true, "3"), new SampleItem(true, "4"),
new SampleItem(true, "4"), new SampleItem(true, "5"), new SampleItem(true, "6"), new SampleItem(true, "7"),
new SampleItem(true, "1"), new SampleItem(true, "2"), new SampleItem(true, "3"), new SampleItem(true, "4"),
new SampleItem(true, "4"), new SampleItem(true, "5"), new SampleItem(true, "6"), new SampleItem(true, "7"),
new SampleItem(true, "1"), new SampleItem(true, "2"), new SampleItem(true, "3"), new SampleItem(true, "4"),
};
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}