Многопоточный стиль DataTrigger IValueConverter в WPF - PullRequest
0 голосов
/ 13 ноября 2011

Я условно форматирую просмотр списка, устанавливая Style DataTrigger и привязывая его к IValueConverter (CheckForShade), который возвращает, если стиль должен быть применен.

<Style.Triggers>       
            <DataTrigger Binding="{Binding Converter={StaticResource CheckForShade}}" Value="false" >
                <Setter Property="Background" Value="Red" />
            </DataTrigger>
</Style.Triggers>

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

Также в настоящее время он замедляет открытие приложения, проверяя все строки ListView и применяя форматирование. Я хотел бы отложить проверку форматирования до тех пор, пока пользовательский интерфейс не загрузится, а затем многопоточность каждой строки.

1 Ответ

3 голосов
/ 13 ноября 2011

Вы можете попробовать использовать привязку с IsAsync, установленным на true, а затем указать запасное значение false: см. http://msdn.microsoft.com/en-us/library/system.windows.data.binding.isasync.aspx.

В качестве альтернативы PriorityBinding с вашим конвертером CheckForShade снаивысший приоритет и привязка по умолчанию, которая возвращает false с более низким приоритетом: http://msdn.microsoft.com/en-us/library/system.windows.data.prioritybinding.aspx Преимущество PriorityBinding состоит в том, что он продолжает прослушивать изменения свойств для привязок выше в списке.Таким образом, вы можете реализовать свой конвертер следующим образом:

  • Создайте рабочий поток для вычисления ваших логических значений и поместите их в статический словарь.
  • Реализуйте свой конвертер, чтобы увидеть результатготов (например, используя TryGetValue в словаре).
  • Если результат готов, верните его.В противном случае верните DependencyProperty.UnsetValue.
...