考虑以下情况:
我使用ListView
绑定了ObservableCollection
DataContext
:
<ListView ItemsSource="{Binding}">
包含class
数据的string
使用DependencyProperty
机制来保持显示的内容与数据集合同步。
ListView
有一列可编辑(我按照教程here来实现此目的); ListViewItem
可以是TextBlock
或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>
searchFormatter
是IMultiValueConverter
,txtSearch
是包含搜索查询的TextBox
。
我还在学习WPF,所以我不熟悉最好的方法或可能的方法。有没有办法保持数据绑定(以便编辑反映在集合和ListView
),并仍然以不同的方式表示用户的数据(以便搜索匹配可能是粗体)?如果我手动管理绑定,也许会更清洁?
答案 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
。