У меня есть длинный список предметов, которые я хотел бы отфильтровать.Я добавил свойство 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, но это не дает ожидаемого эффекта.