绑定和支持富文本格式

时间:2012-11-22 20:01:12

标签: c# wpf listview binding .net-4.5

考虑以下情况:

  • 我使用ListView绑定了ObservableCollection DataContext

    <ListView ItemsSource="{Binding}">
    

    包含class数据的string使用DependencyProperty机制来保持显示的内容与数据集合同步。

  • ListView有一列可编辑(我按照教程here来实现此目的); ListViewItem可以是TextBlockTextBox。这是使用DataTemplate和两个Style资源完成的。
  • 我想基于搜索字符串格式化TextBlock中显示的字符串。具体来说,我想将ListView的项目格式化为粗体,因为如果匹配,用户在搜索查询中键入(只有按顺序匹配的字符应该变为粗体)。只需要显示当前使用TextBlock呈现的文本(即当前未编辑的文本)。

我考虑使用IMultiValueConverter来引用呈现数据的TextBlock,以便我可以适当地格式化文本。但是,这会破坏我设置的绑定:

<TextBlock.Text>
  <MultiBinding Converter="{StaticResource searchFormatter}" ConverterParameter="{x:Reference Name=txtSearch}">
    <MultiBinding.Bindings>
      <Binding Path="NameOfBoundDependencyProperty"/>
      <Binding RelativeSource="{RelativeSource Self}"/>
    </MultiBinding.Bindings>
  </MultiBinding>
</TextBlock.Text>

searchFormatterIMultiValueConvertertxtSearch是包含搜索查询的TextBox

我还在学习WPF,所以我不熟悉最好的方法或可能的方法。有没有办法保持数据绑定(以便编辑反映在集合和ListView),并仍然以不同的方式表示用户的数据(以便搜索匹配可能是粗体)?如果我手动管理绑定,也许会更清洁?

1 个答案:

答案 0 :(得分:0)

我决定使用支持HTML的Control,以便我可以使用IValueConverter动态更新显示文本的值,而不会影响任何活动绑定。我使用了here中的代码并对其进行了修改,使其在TextBlock中看起来像ListView

BorderBrush = Brushes.Transparent;
SelectionBrush = Brushes.Transparent;
Cursor = Cursors.Arrow;
BorderThickness = new Thickness(0);
Background = Brushes.Transparent;

但是,我仍然需要触发IValueConverter,以便在用户输入搜索查询(here中的代码)时更新显示内容:

ICollectionView view = CollectionViewSource.GetDefaultView(ItemsSource);
view.Refresh();

我不想放慢搜索过程的速度,因此如果实际存在匹配(或者匹配状态不匹配),我只强制刷新。我的IValueConvertor只是插入了粗体标记以匹配搜索查询:

<RichTextBox Text="{Binding Path=DisplayItem, Converter={StaticResource searchFormatter}, ConverterParameter={x:Reference txtSearch}}"/>

searchFormatter这段时间是IValueConvertor