Выбор строки в сетке управления из кода - PullRequest
1 голос
/ 24 апреля 2020

Я пишу приложение, которое использует два элемента управления сеткой. Если пользователь выбирает строку в левом элементе управления сеткой, соответствующая строка в правом элементе управления сеткой должна быть выбрана из кода. Для обеих сеток я использую производный класс управления сеткой, который позволяет пользователю выбирать несколько строк одновременно. Код для выбора строки из кода работает, проблема, с которой я сталкиваюсь, заключается в том, что (очевидно) другие строки не выбраны должным образом , При выборе нескольких строк впоследствии в правом элементе управления сеткой (путем щелчка по строке, а затем по другой, используя shift + щелчок), выбирается намного больше строк, чем ожидалось.

public class CustomDataGrid : DataGrid
{
    public CustomDataGrid()
    {
        SelectionChanged += CustomDataGrid_SelectionChanged;
    }

    void CustomDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        SelectedItemsList = SelectedItems;
    }

    #region SelectedItemsList

    public IList SelectedItemsList
    {
        get { return (IList)GetValue(SelectedItemsListProperty); }
        set { SetValue(SelectedItemsListProperty, value); }
    }

    public static readonly DependencyProperty SelectedItemsListProperty =
            DependencyProperty.Register("SelectedItemsList", typeof(IList), typeof(CustomDataGrid), new PropertyMetadata(null));

    #endregion
}

В файле xaml он используется как this:

<vm:CustomDataGrid ItemsSource="{Binding LeftGridItems}" SelectedItemsList="
{Binding SelectedLeftGridItems, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
AutoGenerateColumns="False" SelectionMode="Extended" IsReadOnly="True" 
CanUserAddRows="False" Margin="7,0,7,7" Grid.Row="3" Grid.Column="0">
    <DataGrid.Columns>
        ...

Код для выбора в левой сетке:

public IList SelectedLeftGridItems
{
    get { return _selectedLeftGridItems; }
    set
    {
        _selectedLeftGridItems = value;

        // Select the copy on the right side, if available
        if (_selectedLeftGridItems != null && _selectedLeftGridItems.Count > 0)
        {
            Element selected = ((Element)SelectedLeftGridItems[0]);
            if (!string.IsNullOrEmpty(selected.CopyOf))
            {
                SelectedRightGridItems.Clear();
                SelectedRightGridItems.Add(RightGridItems.FirstOrDefault(e => Path.GetFileName(e.Path) == Path.GetFileName(selected.CopyOf)));
                OnPropertyChanged("SelectedRightGridItems");
            }
        }

        OnPropertyChanged("SelectedLeftGridItems");
    }
}

Как я могу убедиться, что выбранные элементы в правой сетке правильно администрируются?

1 Ответ

0 голосов
/ 24 апреля 2020

Выполнение «выбора нескольких строк» ​​в сетке может быть PITA на основе нажатия Shift, Ctrl, одного нажатия, которое может отменить все остальное, уже отмеченное.

Одна вещь, которую я сделал, - это добавить флажок в качестве первого столбца в сетке, который связан со свойством в элементе управления строкой со свойством, таким как

public bool IsChosen {get; set;}

Sample grid with checkbox

Тогда в вашем коде ваш исходный источник строк для отображения сетки может сделать ...

foreach( var xRow in DataGridRowSource.Where( s => s.IsChosen ))
{
   // find in other grid and similarly mark
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...