Отмена выбора элемента из сетки данных Silverlight при двойном щелчке - PullRequest
1 голос
/ 22 марта 2011

У меня есть сетка данных Silverlight 4.0, для которой SelectionMode имеет значение Single. Проблема в том, что пользователям нужно нажать CTRL + щелчок на уже выбранной строке, чтобы отменить ее выбор (и в сетке ничего не выделено). Я бы хотел, чтобы они могли просто щелкнуть левой кнопкой мыши по уже выбранной строке, чтобы отменить ее выбор.

Я попытался сделать это с событием SelectionChanged (проверка добавленных элементов в аргументах события), однако это не сработало, потому что событие не генерируется, когда пользователь дважды щелкает одну и ту же строку.

Какой совет?

Ответы [ 2 ]

0 голосов
/ 29 марта 2011

У меня та же задача, поэтому вот мое решение: прикрепить обработчик для события MouseLeftButtonDown в datagrid, используя AddHandler dataGrid.AddHandler (UIElement.MouseLeftButtonDownEvent, new MouseButtonEventHandler (DataGrid_MouseLeftButtonDown), true); сохранить SelectedIndex в приватной переменной

    private int prevSelectedIndex;
    void DataGrid_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        if (prevSelectedIndex != -1 && prevSelectedIndex == dataGrid.SelectedIndex)
        {
            dataGrid.SelectedIndex = -1;
        }
        prevSelectedIndex = dataGrid.SelectedIndex;
    }

если вы хотите повторно использовать эту логику, вы можете создать Поведение для типа DataGrid

Добавить ссылку на сборку System.Windows.Interactivity, добавить класс DataGridSecondClickUnselectBehavior

public class DataGridSecondClickUnselectBehavior : Behavior<DataGrid>
{
    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.AddHandler(UIElement.MouseLeftButtonDownEvent, new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonDown), true);
    }

    private int prevSelectedIndex;
    void AssociatedObject_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        if (prevSelectedIndex != -1 && prevSelectedIndex == AssociatedObject.SelectedIndex)
        {
            AssociatedObject.SelectedIndex = -1;
        }
        prevSelectedIndex = AssociatedObject.SelectedIndex;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();

        AssociatedObject.RemoveHandler(UIElement.MouseLeftButtonDownEvent, new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonDown));
    }
}

Теперь, после того как вы скомпилируете решение в blend, вы можете добавить это поведение просто перетаскиванием из Активы-> Поведения в элемент управления DataGrid

0 голосов
/ 22 марта 2011

Нет способа захватить второе событие, потому что оно никогда не запускается. Что вы можете сделать, так это применить тип настройки, использованный в этом проекте, к тому, который захватывает второй щелчок и запускает событие во второй раз, если хотите:

http://www.codeproject.com/KB/silverlight/doubleClickDataGridSL.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...