WPF Datagrid OnPropertyChanged вызывает событие SelectionChanged

У меня есть сетка данных WPF, привязанная к модели.

Внутри модели у меня есть свойство, определенное как

   public String status
    {
        get
        {
            return m_status;
        }
        set
        {
            m_status = value;
            OnPropertyChanged("status");           
        }
    }

Это свойство информирует сетку об изменениях через OnPropertyChanged.

Я также обрабатываю событие SelectionChanged для запуска различных действий.

 SelectionChanged="gridSongs_SelectionChanged"


    private void gridSongs_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        Console.WriteLine("gridSongs_SelectionChanged " + sender.ToString());
    }

Во время тестирования я заметил, что каждый раз, когда я меняю свойство «статус» в коде, сетка автоматически обновляется (это то, что я хочу), но также запускает событие SelectionChanged.

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

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

Заранее большое спасибо.


person Mozzak    schedule 17.04.2015    source источник


Ответы (1)


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

Нет, но есть простой обходной путь. Добавьте переменную private bool isLocal и установите для нее значение true, прежде чем вносить какие-либо изменения, а затем вернитесь к false:

isLocal = true;
status = "Some Value";
isLocal = false;

Затем в обработчике SelectionChanged проверьте эту переменную и реагируйте, только если она равна false:

private void gridSongs_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (!isLocal ) Console.WriteLine("gridSongs_SelectionChanged " + sender.ToString());
}
person Sheridan    schedule 17.04.2015
comment
спасибо Шеридан. Это будет работать. На самом деле я реализовал другое событие mouseup и переместил свою логику в событие SelectionChanged. Кажется, это тоже работает. Мне просто нужна была дополнительная логика, чтобы проверить, выбрана ли строка или нет, но мне нравится и ваша версия. Попробую. - person Mozzak; 17.04.2015