动态数据绑定ListBox + WPF + FlowDocument

时间:2016-08-25 10:53:53

标签: wpf listview data-binding

我有一个listBox,我试图使用ItemsSource绑定到IList集合。我的问题场景出现在每个person对象都有一个FlowDocument时,我试图在listBoxItem中的richTextBox中显示。

想象一下,当有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}
}

1 个答案:

答案 0 :(得分:1)

您可以在两个控件中分隔UI以提高性能。考虑在人员类中添加一个唯一属性,如数据库表中的主键。

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中的ID。

你的xaml中分别有一个RichTextBox。

<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;
          } 
}