WPF DataGrid Multiselect启用了虚拟化MVVM

时间:2017-12-17 14:34:59

标签: c# wpf mvvm datagrid

我有一个启用了虚拟化的DataGrid,并且正在尝试多选择工作。

我已经定义了DataGrid.ItemContainerStyle

        <DataGrid.ItemContainerStyle >
            <Style TargetType="{x:Type DataGridRow}">
                <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"></Setter>
            </Style>

如果虚拟化被禁用或者我不滚动,一切正常,但是一旦我启用虚拟化滚动并且DataGridRows从内存中消失,它就会停止工作。 IsSelected属性停止在我的视图模型上设置IsSelected。

我还尝试创建一个DependencyProperty来尝试自己处理它。但是一旦我开始滚动选择的行,就会发送随机事件。例如,有时会调用我未选择的行,并且会多次触发事件。

我觉得这是应该通过defualt工作的东西。你知道多选是否应该有效,你对我如何解决这个问题有任何想法吗?

1 个答案:

答案 0 :(得分:1)

我通过创建依赖属性

解决了这个问题
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)

<DataGrid dependencyProperties:DataGridSelectedItemsDependencyProperty.SelectedItemsChangedHandler="{Binding SelectedItemsChanged}"