Установка свойства зависимости WPF без запуска событий - PullRequest
2 голосов
/ 30 сентября 2008

Мне нужно установить свойство зависимости для элемента управления (Slider.Value) в моем коде, чтобы оно не вызывало событие ValueChanged (поскольку я устанавливаю значение, а не пользователя). Каков наилучший способ справиться с этой ситуацией в WPF?

Для пояснения я пытаюсь подключить ползунки WPF к пользовательскому элементу управления WinForms. В настоящее время в моем приложении есть обработчик события ValueChanged, который передает значение ползунка в элемент управления WinForms с помощью вызова метода. Элемент управления WinForms (который на самом деле является оберткой вокруг собственного окна OpenGL) должен иметь возможность динамически изменять ползунок на основе его внутренних вычислений. Для этого я использую абстракцию ползунка (ISlider), создаю в своем приложении WPF-аромат этого ползунка и передаю дескриптор его основы элементу управления WinForms через свойство .NET в пользовательском элементе управления WinForms. Все это в настоящее время работает, просто когда внутренняя логика решает, что ползунок нужно изменить, она вызывает ISlider :: SetPos (), который затем изменяет ползунок WPF, который затем вызывает событие ValueChanged на ползунке, и обработчик для этого события извлекается позиция ползунка и передается в элемент управления WinForms, который первым создал событие. Похоже, что предложения Лигаз и Алан Ле должны сработать, но я просто не уверен, что сделаю это наилучшим образом.

Ответы [ 3 ]

5 голосов
/ 01 октября 2008

Вот просто обходной путь / взломать. Добавьте логическое значение, чтобы отслеживать, изменили ли вы настройки, скажем, «IsChangedByMe». При изменении свойства зависимости в коде установите для bool значение true. В событии ValueChanged, если IsChangedByMe имеет значение true, ничего не делать.

5 голосов
/ 01 октября 2008

Вы уверены, что действительно хотите это сделать? Если к этому свойству привязана часть данных пользовательского интерфейса, и вы позволяете изменить значение без запуска события ValueChanged, вы быстро получите пользовательский интерфейс, который больше не синхронизируется с данными.

В случае вашего слайдера, представьте, что пользователь устанавливает его на 75%. Теперь ваш код меняет его на 10% в фоновом режиме, но подавляет уведомление об изменении. Он все еще выглядит на экране, как будто он на 75% (так как не было сказано, что он изменился), но он используется как код, который работает на 10%. Звучит как рецепт путаницы.

1 голос
/ 01 октября 2008

Одно из возможных решений - извлечь из Slider и переопределить OnValueChanged (...) . Если вы не хотите вызывать событие, вы ничего не должны делать, в противном случае вам следует вызвать базовую реализацию.

...