Можно ли указать привязке WPF асинхронно реагировать на событие PropertyChanged (низкий приоритет)? - PullRequest
1 голос
/ 30 августа 2010

У меня есть длинный список предметов, которые я хотел бы отфильтровать.Я добавил свойство IsFiltered к модели представления в моем списке.Используя ItemContainerStyle, я могу связать видимость ListViewItem со свойством IsFiltered.

<ListView ItemsSource="{Binding Path=MyItems}">
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
           <Style.Triggers>
              <DataTrigger Binding="{Binding Path=IsFiltered}" Value="True">
                 <Setter Property="Visibility" Value="Collapsed"/>
              </DataTrigger>
           </Style.Triggers>
        </Style>
    </ListView.ItemContainerStyle>
</ListView>

Все работает хорошо, и изменение свойства IsFiltered правильно отражается на пользовательском интерфейсе.Я запускаю фоновый процесс, чтобы определить, какие элементы фильтровать и когда он завершает свойство IsFiltered каждого из элементов модели представления обновляется в потоке пользовательского интерфейса.Проблема в том, что из-за большого количества событий PropertyChanged происходит очень заметная пауза.Мне удалось смягчить это, используя

public bool IsFiltered
{
   get
   {
       return m_IsFiltered;
   }
   set
   {
       if (m_IsFiltered == value)
       {
           return;
       }
       m_IsFiltered = value;
       Dispatcher.CurrentDispatcher.BeginInvoke(
           DispatcherPriority.Background,
           (System.Action)(() => RaisePropertyChanged("IsFiltered")));
    }
}

в модели представления.RaisePropertyChanged просто вызывает событие PropertyChanged.

Я пытаюсь ограничить знание структуры пользовательского интерфейса (WPF) из модели представления.В этом случае я хотел бы просто вызвать вызов RaisePropertyChanged и каким-то образом дать UI ответственность за прослушивание изменения свойства в асинхронном режиме.Это возможно?Не очень критично, что событие обрабатывается, поскольку измененное свойство запускается.

Я пытался добавить IsAsync = True к привязке DataTrigger, но это не дает ожидаемого эффекта.

1 Ответ

0 голосов
/ 30 августа 2010

IsAsync - это хорошо, но вы должны правильно определить, какое изменение вашего свойства (вызванное назначением новых данных) потребует долго выполняемой задачи, а затем поставить его там. CMIIW IsAsync для вашей привязки триггера данных не работал, потому что для внесения изменений в IsFiltered это всего лишь простая задача, не требующая длительной работы.

Итак, выясните, какое из изменений свойства, возможно, заняло длительное задание, поместите туда IsAsync = True .

Надеюсь, что поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...