0

考虑以下场景:

  • 我有一个ListView绑定到ObservableCollection使用的DataContext

    <ListView ItemsSource="{Binding}">
    

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

  • ListView有一个可编辑的列(我按照这里的教程来实现这一点);ListViewItem然后是 a或TextBlocka TextBox。这是使用一个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>

searchFormatterIMultiValueConvertertxtSearchTextBox包含搜索查询。

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

4

1 回答 1

0

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

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

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

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

我不想减慢搜索过程,所以我只在实际匹配时才强制刷新(或者匹配状态变为不匹配)。我IValueConvertor只是插入了粗体标签以匹配搜索查询:

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

searchFormatter这次是哪里IValueConvertor

于 2012-11-27T18:16:32.523 回答