GridView multiselect selection by code

1 Answer 9 Views
GridView
Deltaohm
Top achievements
Rank 3
Bronze
Iron
Iron
Deltaohm asked on 20 May 2024, 12:29 PM | edited on 20 May 2024, 12:30 PM

Hi,

I use this behavior to manage multiple selection on radgridview (with selection mode = "extended" and with GridViewSelectColumn)

It works but when I try to initialize the selection with some items at the end of initialization I receive the OnSelectionChanged that remove all the elements selected but the first.

public class GridViewMultiSelect : Behavior<RadGridView>
{
	protected override void OnAttached()
	{
		base.OnAttached();
		AssociatedObject.DataContextChanged += OnDataContextChanged;
		AssociatedObject.SelectedItems.CollectionChanged += OnSelectedItemsChanged;
		AssociatedObject.SelectionChanging += OnSelectionChanged;
		AssociatedObject.Items.CollectionChanged += OnItemsChanged;
	}

	private void OnSelectionChanged(object? sender, SelectionChangingEventArgs e)
	{
		
	}

	private void OnItemsChanged(object? sender, NotifyCollectionChangedEventArgs e)
	{
	}

	private void Select(IEnumerable<NsMisuraViewWithType> misure)
	{
		foreach (var item in misure)
		{
			AssociatedObject.SelectedItems.Add(item);
		}
	}

	private void OnDataContextChanged(object? sender, DependencyPropertyChangedEventArgs e)
	{
		if (AssociatedObject.DataContext is LoadedMeasurmentsVM viewModel)
		{
			viewModel.SelectAction = Select;
			SetSelectMeasurements();
		}
	}

	private void SetSelectMeasurements()
	{
		if (AssociatedObject.DataContext is LoadedMeasurmentsVM viewModel)
		{
			foreach (var item in AssociatedObject.SelectedItems)
			{
				if (viewModel.SelectedMeasurements.All(m => m.Misura.Id != ((NsMisuraViewWithType)item).Misura.Id))
				{
					viewModel.SelectedMeasurements.Add((NsMisuraViewWithType)item);
				}
			}
		}
	}

	private void OnSelectedItemsChanged(object? sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
	{
		SetSelectMeasurements();
	}

	protected override void OnDetaching()
	{
		base.OnDetaching();
		AssociatedObject.DataContextChanged -= OnDataContextChanged;
		AssociatedObject.SelectedItems.CollectionChanged -= OnSelectedItemsChanged;
	}
}
Deltaohm
Top achievements
Rank 3
Bronze
Iron
Iron
commented on 20 May 2024, 01:00 PM

It seems that the property IsSynchronizedWithCurrentItem (default true)  is related to the issue, if I set it to false I don't get the remove call.

1 Answer, 1 is accepted

Sort by
0
Dimitar
Telerik team
answered on 21 May 2024, 11:07 AM

Hello Deltaohm,

I was not able to reproduce this. I have attached a sample project that uses your behavior. Please check it and let me know if I am missing something. 

In addition, I want to mention that we have another example that shows how you can bind the selected items: xaml-sdk/GridView/BindingSelectedItemsFromViewModel/GridViewSelectionUtilities.cs at master · telerik/xaml-sdk

I am looking forward to your reply.

Regards,
Dimitar
Progress Telerik

Love the Telerik and Kendo UI products and believe more people should try them? Invite a fellow developer to become a Progress customer and each of you can get a $50 Amazon gift voucher.

Tags
GridView
Asked by
Deltaohm
Top achievements
Rank 3
Bronze
Iron
Iron
Answers by
Dimitar
Telerik team
Share this question
or