0

次のシナリオを検討してください。

  • を使用して にListViewバインドされている があります。ObservableCollectionDataContext

    <ListView ItemsSource="{Binding}">
    

    データをclass含む は、このメカニズムを使用して、表示されたコンテンツをデータ コレクションと同期させます。stringDependencyProperty

  • ListView編集可能な列が1つあります(これを達成するために、ここのチュートリアルに従いました)theListViewItemは aTextBlockまたは a のいずれかTextBoxです。これは、1 つのリソースDataTemplateと 2 つの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>

searchFormatterでありIMultiValueConvertertxtSearch検索TextBoxクエリを含む です。

私はまだWPFを学んでいるので、最善のアプローチや何が可能かについてはよくわかりません。データをバインドしたままにして (編集がコレクションとに反映されるようにListView)、ユーザーに対してデータを別の方法で表現する方法はありますか (検索結果が太字になるようにするため)。バインディングを手動で管理すると、おそらくきれいになるでしょうか?

4

1 に答える 1

0

ControlHTML をサポートする を使用することにしました。これにより、 を使用しIValueConverterて、アクティブなバインディングに影響を与えることなく、表示されるテキストの値をその場で更新できます。ここのコードを使用して、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}}"/>

今回searchFormatterIValueConvertor.

于 2012-11-27T18:16:32.523 に答える