C# WPF&x2B;MVVM:覆盖DataGridComboxColumn中的自动完成
我已经搜索了很长一段时间,但不知道如何覆盖DataGridComboxColumn中的自动完成功能 我想做的是这里解释的,除了一个组合框: 也就是说:我希望能够输入任何字符串,然后对DataGridComboBoxColumn中的ComboBox项应用一个过滤器,以仅将与此匹配的项显示为子字符串 我是WPF的新手,已经在线搜索了一段时间。我发现了事件设置器和命令行为Collection.Behaviors之类的东西,但我无法清楚地了解其中的可能性(和不可能性) 我有:C# WPF&x2B;MVVM:覆盖DataGridComboxColumn中的自动完成,c#,wpf,mvvm,combobox,autocomplete,C#,Wpf,Mvvm,Combobox,Autocomplete,我已经搜索了很长一段时间,但不知道如何覆盖DataGridComboxColumn中的自动完成功能 我想做的是这里解释的,除了一个组合框: 也就是说:我希望能够输入任何字符串,然后对DataGridComboBoxColumn中的ComboBox项应用一个过滤器,以仅将与此匹配的项显示为子字符串 我是WPF的新手,已经在线搜索了一段时间。我发现了事件设置器和命令行为Collection.Behaviors之类的东西,但我无法清楚地了解其中的可能性(和不可能性) 我有: <DataGri
<DataGrid ... >
...
<DataGrid.Columns>
...
<MyCustomDataGridComboBoxColumn Header="My Header" MinWidth="200" >
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding DataContext.MyData, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />
<Setter Property="SelectedItem" Value="{Binding DataItem, UpdateSourceTrigger=LostFocus, ValidatesOnDataErrors=True}" />
<Setter Property="DisplayMemberPath" Value="HardwareId" />
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding DataContext.MyFilteredData, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />
<Setter Property="SelectedItem" Value="{Binding DataItem, UpdateSourceTrigger=LostFocus}" />
<Setter Property="DisplayMemberPath" Value="HardwareId" />
<Setter Property="IsEditable" Value="True"/>
<Setter Property="Text" Value="{Binding DataContext.MyNewDataItem, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, UpdateSourceTrigger=LostFocus, ValidatesOnDataErrors=True, NotifyOnValidationError=True}" />
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</MyCustomDataGridComboBoxColumn>
...
</DataGrid.Columns>
</DataGrid>
...
...
...
理想情况下,我希望创建一个从DataGridComboxColumn继承的新类,并为其提供一些自定义逻辑,例如在其构造函数中提供一个匿名函数,以便将来可以以不同的方式重写自动完成行为
这是可能的,还是我完全走错了方向?我不是说你的方法是错误的,但是,我会采取不同的方法。对我来说,使用DataGridTemplateColumn并提供具有您所说功能的组合框似乎更容易
<DataGridTemplateColumn Header="ColumnName" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<YourCustomComboBox/>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
编辑:
不久前,我需要一个具有相同功能的组合框。我最终把文本框和弹出控件结合起来,因为它让我对它有了更多的控制
<TextBox Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}" x:Name="editBox"/>
<Popup x:Name="textboxPopup" Width="{Binding ElementName=editBox, Path=ActualWidth, Mode=OneWay}"
PlacementTarget="{Binding ElementName=editBox}"
StaysOpen="False"
IsOpen="{Binding Path=IsOpen, Mode=OneWay}">
<Grid>
<DockPanel MaxHeight="500">
<ListView SelectionMode="Single"
ItemsSource="{Binding Path=Suggestions}"
Name="popupList">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Style.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"Color="LightBlue"/>
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="LightBlue"/>
</Style.Resources>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Background" Value="LightBlue"/>
</Trigger>
</Style.Triggers>
</Style>
</ListView.ItemContainerStyle>
</ListView>
</DockPanel>
</Grid>
在codebehind中,我订阅了TextChanged事件和一些其他方便的事件。我无法共享所有代码,因为它是生产代码。然而,互联网上还有其他一些人有类似的实现:,当然还有你在问题中发布的链接。外面已经足够了
关于将自定义控件用作TargetType。。。我看不出有什么问题,我一直都这样做
CellTemplate不应出现错误。你用对了吗 你好,Martijn,谢谢你的回复。我已经抽象出DataGridComboxColumn,它已经是一个自定义类了。我现在不打算改变这个。不过,我也可以吗?此外,我遇到的问题不仅仅是网格:如何将自动完成功能放在组合框中?我可以将处理程序附加到事件吗?如果有,是哪项活动?如果有代码片段,我将不胜感激。编辑:请注意,在使用您的建议时,我收到错误消息“CellTemplate”的成员未被识别或无法访问。“嗨@Diana,我扩展了我的答案以解决您的评论。嗨,Martijn,感谢您的更新。然而,不幸的是,这并没有使我更接近解决办法。我一直在网上搜索触发器、行为等,但没有找到没有codebehind的示例(这与MVVM不符)