WPF + MVVM:覆盖自动完成在DataGridComboBoxColumn

本文关键字:DataGridComboBoxColumn MVVM 覆盖 WPF | 更新日期: 2023-09-27 18:05:06

我已经搜索了相当长一段时间,但无法弄清楚如何在DataGridComboBoxColumn中覆盖自动完成功能。

我想做的就是这里解释的,除了一个组合框:在列表框中搜索项

即:我希望能够输入任何字符串,然后对DataGridComboBoxColumn中的ComboBox项应用过滤器,以仅显示与此匹配的那些项作为子字符串

我是WPF的新手,已经在网上搜索了一段时间。我发现了像eventsetter和CommandBehaviorCollection这样的东西。行为,但我不能得到一个清晰的画面的可能性(和不可能)。

我有:

  <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的新类,并为其提供一些自定义逻辑,例如在其构造函数中提供一个匿名函数,以便将来可以以不同的方式覆盖自动完成行为。

这是可能的吗,还是我的方法完全错了?

WPF + MVVM:覆盖自动完成在DataGridComboBoxColumn

我不是说你的方法是错误的,但是,我会用不同的方法来处理它。对我来说,使用datagridtemplatecoluml并提供具有您所说的功能的ComboBox似乎更容易。

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

在后面的代码中,我订阅了TextChanged事件和其他一些会派上用场的事件。我不能分享我所有的代码,因为它是生产代码。然而,在互联网上也有一些人有类似的实现:使用组合框,使用文本框,当然还有你在问题中发布的链接。外面的人太多了。

关于使用您的自定义控件作为TargetType…我不觉得这有什么不对,我一直都这么做。

CellTemplate的错误不应该发生。你用对了吗?

相关文章:
  • 没有找到相关文章