我有一个启用了虚拟化功能的DataGrid,并且正在尝试进行多选工作。
我已经定义了DataGrid.ItemContainerStyle
<DataGrid.ItemContainerStyle >
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"></Setter>
</Style>
如果禁用了虚拟化或不进行滚动,则一切工作正常,但是在启用了虚拟化的情况下滚动并且DataGridRows从内存移入和移出后,它将立即停止工作。 IsSelected属性停止在我的 View 模型上设置IsSelected。
我还尝试创建DependencyProperty来尝试自己处理。但是,一旦我开始滚动选择的行,就会发送随机事件。例如,有时会调用我未选择的行,并且会多次触发事件。
我觉得这应该通过defualt起作用。您知道多重选择是否应该起作用,并且您对如何解决这个问题有任何想法吗?
最佳答案
我通过创建依赖项属性解决了
public static class DataGridSelectedItemsDependencyProperty
{
public static readonly DependencyProperty SelectedItemsChangedHandlerProperty =
DependencyProperty.RegisterAttached("SelectedItemsChangedHandler",
typeof(ICommand),
typeof(DataGridSelectedItemsDependencyProperty),
new FrameworkPropertyMetadata(OnSelectedItemsChangedHandlerChanged));
public static ICommand GetSelectedItemsChangedHandler(DependencyObject element)
{
if (element == null)
throw new ArgumentNullException(nameof(element));
return element.GetValue(SelectedItemsChangedHandlerProperty) as ICommand;
}
public static void SetSelectedItemsChangedHandler(DependencyObject element, ICommand value)
{
if (element == null)
throw new ArgumentNullException(nameof(element));
element.SetValue(SelectedItemsChangedHandlerProperty, value);
}
private static void OnSelectedItemsChangedHandlerChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var dataGrid = (DataGrid)d;
if (e.OldValue == null && e.NewValue != null)
dataGrid.SelectionChanged += ItemsControl_SelectionChanged;
if (e.OldValue != null && e.NewValue == null)
dataGrid.SelectionChanged -= ItemsControl_SelectionChanged;
}
private static void ItemsControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var dataGrid = (DataGrid)sender;
var itemsChangedHandler = GetSelectedItemsChangedHandler(dataGrid);
itemsChangedHandler.Execute(dataGrid.SelectedItems);
}
}
我认为这样使用(xaml)
<DataGriddependencyProperties:DataGridSelectedItemsDependencyProperty.SelectedItemsChangedHandler="{Binding SelectedItemsChanged}"
关于c# - 具有启用虚拟化功能的WPF DataGrid Multiselect MVVM,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47856135/