Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF&x2B;MVVM:覆盖DataGridComboxColumn中的自动完成_C#_Wpf_Mvvm_Combobox_Autocomplete - Fatal编程技术网

C# WPF&x2B;MVVM:覆盖DataGridComboxColumn中的自动完成

C# WPF&x2B;MVVM:覆盖DataGridComboxColumn中的自动完成,c#,wpf,mvvm,combobox,autocomplete,C#,Wpf,Mvvm,Combobox,Autocomplete,我已经搜索了很长一段时间,但不知道如何覆盖DataGridComboxColumn中的自动完成功能 我想做的是这里解释的,除了一个组合框: 也就是说:我希望能够输入任何字符串,然后对DataGridComboBoxColumn中的ComboBox项应用一个过滤器,以仅将与此匹配的项显示为子字符串 我是WPF的新手,已经在线搜索了一段时间。我发现了事件设置器和命令行为Collection.Behaviors之类的东西,但我无法清楚地了解其中的可能性(和不可能性) 我有: <DataGri

我已经搜索了很长一段时间,但不知道如何覆盖DataGridComboxColumn中的自动完成功能

我想做的是这里解释的,除了一个组合框:

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

我是WPF的新手,已经在线搜索了一段时间。我发现了事件设置器和命令行为Collection.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>

...
...
...
理想情况下,我希望创建一个从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不符)