У меня есть пользовательский элемент управления, у которого есть два DependencyProperties. Каждый DependencyProperty имеет свойство PropertyChangedCallback. Важные обратные вызовы, вызываемые в значениях свойств заказа, устанавливаются. Поэтому, если я пишуПорядок выполнения PropertyChangedCallbacks
Status = MyStatus.DataIsImporting;
var data = AsynchronouslyImportData();
Data = data;
Я хочу, чтобы свойство свойства изменило обратный вызов, который будет вызван до того, как свойство Data изменило обратный вызов. Но согласно отладке (не может найти никакой документации об этом) порядок вызовов обратных вызовов не определен. Есть ли способ разрешить это?
Обновление. Состояние и данные, которые вы видите выше, не устанавливаются непосредственно в пользовательский экземпляр пользователя. Это свойства ViewModel, которые соответствуют свойствам управления пользователями посредством привязок.
Обновление2. Сейчас я играл с этой проблемой и имел очень странное решение. Вот как мой пользовательский контроль использовался раньше:
<MyUserControl Status={Binding Status, Mode=TwoWay} Data={Binding Data}/>
Я только что изменил порядок привязки, и это сработало!
<MyUserControl Data={Binding Data} Status={Binding Status, Mode=TwoWay}/>
Он по-прежнему ведет себя асинхронно (похоже, что это своего рода цикл сообщений внутри системы связывания), но теперь он Кальесы PropertyChangedCallback обработчиков в правильном порядке.
Я занимаюсь поиском по связям и время от времени нахожу подобные проблемы (например, this one), но до сих пор неясно, почему это происходит.
Обновление 3. Я нашел настоящий источник проблем. Приложение, использующее мой элемент управления, имеет ContentControl с несколькими DataTemplates (в зависимости от типа ViewModel). Описанное поведение происходит, когда DataTemplate, где находится мой элемент управления, не является текущим (или когда вы переключаетесь на другой DataTemplate и обратно). Я все еще уточняю детали.
Когда вы говорите «в соответствии с отладкой», что именно вы имеете в виду? Вы отлаживаете это, и они не всегда происходят в желаемом порядке? Вызывается ли код выше из потока пользовательского интерфейса? –
@BrianS, да и да – SiberianGuy
Есть ли причина, по которой они должны быть 'DependencyProperties', а не стандартные свойства, которые повышают NotifyPropertyChanged? Большинство ViewModels реализуют 'INotifyPropertyChanged', но не являются' DependencyObjects'. С 'DependencyProperties' вы имеете меньший контроль над уведомлением о привязке. –