Мне нужны песочные часы, когда привязка IsAsync занята; возможный? - PullRequest
1 голос
/ 22 марта 2012

В настоящее время у меня есть код XAML, подобный этому:

<ListView Name="fileLV" SelectionMode="Extended" ItemsSource="{Binding path=DataContext.SelectedAsset.Files,ElementName=selectionView,IsAsync=True}"/>

Это свойство "Files" возвращает пятнадцать секунд.Все время пользователю интересно, что происходит.Я видел какой-то другой код для отображения запасного значения или использования нескольких привязок, но они не подразумевают «оставь этот элемент управления в покое», как это подразумевают песочные часы над этим элементом управления.

Я хочу, чтобыбыть в состоянии назвать привязку и затем связать некоторые другие свойства со свойством IsBusy этой привязки.Я хочу, чтобы триггер изменил курсор на этом списке, пока его привязка занята.Есть ли какая-либо существующая помощь в рамках WPF для этого?

Ответы [ 3 ]

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

Для этого не используйте IsAsync.В свойстве используйте BackGroundWorker.Сначала верните источник с «рабочим сообщением», запустите BackGroundWorker, затем при обратном вызове укажите реальный источник и вызовите NotifyPropertyChanged.Вы даже можете иметь панель progess.

0 голосов
/ 23 марта 2012

Мне удалось заставить DataTemplateSelector работать.Одним из предостережений было то, что все привязки для ListView должны быть перечисляемыми.В своем контроле я добавил ресурс, подобный этому:

    <UserControl.Resources>
    <x:Array x:Key="LoadingTemplate" Type="DataTemplate">
    <DataTemplate>...my daisy code...</DataTemplate></x:Array>...

Затем я изменил привязку, чтобы она выглядела так:

                    <ListView.ItemsSource>
                        <PriorityBinding>
                            <Binding Path="DataContext.SelectedAsset.Files" ElementName="selectionView" IsAsync="True"/>
                            <Binding Source="{StaticResource LoadingTemplate}" />
                        </PriorityBinding>
                    </ListView.ItemsSource>

Затем я установил этот селектор шаблонов:

    public class OverridableDataTemplateSelector: DataTemplateSelector
    {
        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            return item as DataTemplate ?? base.SelectTemplate(item, container);
        }
    }
0 голосов
/ 22 марта 2012

Я не знаю ни одного встроенного , готового готового решения, но наверняка есть способы сделать из этого приятный опыт. Я дам вам краткое представление о том, как я это сделаю, и, если вам нужно, я также могу придумать код:

  1. Создайте шаблон данных "LoadingItem", который бы отображал какой-либо индикатор выполнения в качестве элемента вашего списка

  2. Создание «DataTemplateSelector» для переключения между LoadingItem и RegularItem вашего списка.

  3. В свойстве Files очистите коллекцию и добавьте элемент, который будет отображаться как LoadingItem (зависит от того, как вы Логика DataTemplateSelector. Запустите другой поток для сканирования файлов и заполнить возврат результатов во временную коллекцию (BackgroundWorker). Когда метод возвращается, вы находитесь на пользовательском интерфейсе снова, очистите коллекцию ItemsSource снова и заполните ее с результатами.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...