2016-08-25 3 views
0

У меня есть listBox, который я пытаюсь связать с коллекцией IList с помощью ItemsSource. Мой проблемный сценарий возникает, когда каждый объект моего объекта имеет FlowDocument, который я пытаюсь отобразить в richTextBox внутри listBoxItem.Динамическая привязка данных ListBox + WPF + FlowDocument

Представьте себе снижение производительности, когда есть 1000 человек объекты,

Есть ли способ, я динамически загружать FlowDocument/RichTextBox, так что не влияет на производительность.

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

<ListBox ItemsSource="{Binding PersonsCollection"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <RichTextBox Document="{Binding PersonHistory}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

благодаря

public class Person 
{ 
    public FlowDocument PersonHistory{get;set} 
} 
+0

Пожалуйста, пост код, который вы пробовали до сих пор, так что другие могут помочь –

+0

@UmairFarooq это ближе всего я мог бы ввести здесь, 150 документов потока, связанные с ListBox, что в конечном итоге вызывает падение производительности при прокрутке. – Sandepku

ответ

1

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

public class Person 
{ 
    public long ID{get;set;} 
    public FlowDocument PersonHistory{get;set} 
} 

Теперь вы можете иметь один ListBox

<ListBox Name="PersonsListBox" ItemsSource="{Binding PersonsCollection"} DisplayMemberPath="ID" SelectionChanged="personsList_SelectionChanged"> 
</ListBox> 

С которой вы связать PersonsCollection и установить DisplayMemberPath="ID", чтобы показывать только идентификаторы в ListBox.

И у вас есть RichTextBox отдельно в вашем xaml.

<RichTextBox Name="personHistoryTextBox"/> 

Если вы видите, что я добавил событие с ListBox. Событие SelectionChanged.

В вашем случае вы можете сделать что-то подобное.

private void personsList_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) 
{ 
      if(PersonsListBox.SelectedItem != null){ 
       personHistoryTextBox.Document = (PersonsListBox.SelectedItem as Person).PersonHistory; 
      } 
} 
+0

Мне нравится идея selectChangedEvent, но, если я в конечном итоге прокручиваю с помощью мыши, там я не сталкиваюсь с selectChangedEvent. – Sandepku

+1

Вы не хотите иметь плохую производительность, а затем приводите поведение, управляемое событиями, управляемое событиями. Как прокрутка. Поскольку этот вид события (если существует) быстро меняется, и он будет давать плохую производительность, если вы выполняете тяжелые задачи в этом виде событий. –

+0

, но есть ли выход с динамической привязкой и прокруткой, мне было интересно об этом, но я проверяю производительность с событием выбора, спасибо. – Sandepku

Смежные вопросы