c# - WPF + MVVM : Override autocomplete in DataGridComboBoxColumn

标签 c# wpf mvvm combobox autocomplete

我已经搜索了很长时间,但无法弄清楚如何重写DataGridComboBoxColumn中的自动完成功能。

除了组合框,我想做的是在此处说明:Searching for items in a list box

也就是说:我希望能够输入任何字符串,然后将过滤器应用于DataGridComboBoxColumn中的ComboBox项,以仅将与此匹配的那些项显示为子字符串。

我是WPF的新手,并且已经在网上搜索了一段时间。我已经找到了诸如EventSetters和CommandBehaviorCollection.Behaviors之类的东西,但是我无法清楚地了解各种可能性(和可能性)。

我有:

  <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>

理想情况下,我想创建一个继承自DataGridComboBoxColumn的新类,并为其提供一些自定义逻辑,例如在其构造函数中提供一个匿名函数,以便将来可以以不同的方式覆盖自动完成行为。

这是否有可能,或者我是完全以错误的方式来做这件事?

最佳答案

我并不是说您的方法是错误的,但是,我会采取不同的方法。对我来说,使用DataGridTemplateColumn并提供具有您所提到的功能的ComboBox似乎更容易。

<DataGridTemplateColumn Header="ColumnName" Width="*">
  <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
      <Grid>
        <YourCustomComboBox/>
      </Grid>
    </DataTemplate>
  </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

编辑:

前一阵子,我需要一个具有相同功能的ComboBox。我最终将TextBox与Popup控件组合在一起,因为它使我对它有了更多的控制。
<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>

在后面的代码中,我订阅了TextChanged事件和其他一些方便的事件。我不能共享所有代码,因为它是生产代码。但是,互联网上还有其他一些人也有类似的实现方式:using a ComboBoxusing a textbox,当然还有您在问题中发布的链接。那里有足够的余地。

关于将您的自定义控件用作TargetType的问题……我没有发现任何问题,我一直都这样做。

CellTemplate错误不会发生。您使用正确吗? See this link for an example

关于c# - WPF + MVVM : Override autocomplete in DataGridComboBoxColumn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23872186/

相关文章:

c# - 在 C# 中为 dataGridView 单元格提供背景图像

wpf - XPS 文档中的注释

c# - 应用程序资源中的 WPF 资源字典

c# - listview刷新时焦点不是 "holding"

c# - 触摸相对于屏幕的位置。 Windows手机

c# - 如何使用 Caliburn.Micro 将容器绑定(bind)到 MVVM 标准中的 ListView 控件?

c# - 升级到 5.0.0 后 TokenValidationParameters 不再起作用

c# - 使用 WPF 时如何将 Checked 属性状态保存到 Properties.Settings?

c# - 当 Prism 中的另一个属性发生变化时更新一个属性

c# - 禁用将项目添加到集合