在 DataGrid 中使用 WPF 文本框自动完成
Using WPF TextBox Autocomplete in a DataGrid
我最近在这里抓取了这个项目:https://github.com/Nimgoble/WPFTextBoxAutoComplete 它向 WPF 中的文本框添加了自动完成行为。
您将此 属性 添加到自动完成行为的文本框中:behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding YourCollection}"
我试图让行为与 DataGridTextColumn 中的文本框一起工作,但没有成功。如何将此 属性 添加到 DataGridTextColumn 中包含的文本框?
谢谢!
编辑:尝试制作 DataTemplate 列,但仍然无效。
<DataGridTemplateColumn Header="Test Stuff">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding TestItems, RelativeSource={RelativeSource AncestorType=DataGrid}}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
如果在我的 DataGrid 绑定上关闭,也许会有什么问题?这是数据网格:
<DataGrid ItemsSource="{Binding UsersList.Users}"
AutoGenerateColumns="False"
GridLinesVisibility="All"
FontSize="12"
Margin="0"
HorizontalAlignment="Center"
BorderThickness="0">
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}"
BasedOn="{StaticResource MetroDataGridRow}">
</Style>
</DataGrid.RowStyle>
<DataGrid.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Grid Background="{TemplateBinding Background}">
<ContentPresenter VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGrid.CellStyle>
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}"
ClipboardContentBinding="{x:Null}"
behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding TestItems, RelativeSource={RelativeSource AncestorType=DataGrid}}"
Header="Name" />
<DataGridTextColumn Binding="{Binding ID}"
ClipboardContentBinding="{x:Null}"
Header="User ID" />
<DataGridCheckBoxColumn Binding="{Binding Valid}"
ElementStyle="{DynamicResource MetroDataGridCheckBox}"
ClipboardContentBinding="{x:Null}"
Header="Valid Name" />
<DataGridTemplateColumn Header="Test Stuff">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding TestItems, RelativeSource={RelativeSource AncestorType=DataGrid}}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
您应该使用该行为,可能您的行的 DataContext 存在问题。
按照此答案更新您从 DataGrid 获取 DataContext 的行为绑定:Bind to DataContext Property from within DataGridColumn
如果有人仍然对这个主题感兴趣,有一种简单的方法可以将自动完成绑定到 datagridtextcolumn。
使用来自 https://github.com/Nimgoble/WPFTextBoxAutoComplete 的 AutoCompleteBehavior
并使用 https://thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/
中的 BindingProxy class
...
xmlns:behaviors="clr-namespace:WPFTextBoxAutoComplete;assembly=WPFTextBoxAutoComplete"
...
<DataGrid Name="dataGrid">
<DataGrid.Resources>
<local:BindingProxy x:Key="proxy" Data="{Binding}" />
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header = "Target" Binding = "{Binding Target}">
<DataGridTextColumn.EditingElementStyle>
<Style TargetType="{x:Type TextBox}">
<Setter Property="behaviors:AutoCompleteBehavior.AutoCompleteItemsSource"
Value="{Binding Data, Source={StaticResource proxy}}" />
</Style>
</DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
...
InitializeComponent();
BindingProxy bindingProxy = dataGrid.Resources["proxy"] as BindingProxy;
var list = new List<string>();
list.Add("abc");
list.Add("bcd");
bindingProxy.Data = list;
....
我最近在这里抓取了这个项目:https://github.com/Nimgoble/WPFTextBoxAutoComplete 它向 WPF 中的文本框添加了自动完成行为。
您将此 属性 添加到自动完成行为的文本框中:behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding YourCollection}"
我试图让行为与 DataGridTextColumn 中的文本框一起工作,但没有成功。如何将此 属性 添加到 DataGridTextColumn 中包含的文本框?
谢谢!
编辑:尝试制作 DataTemplate 列,但仍然无效。
<DataGridTemplateColumn Header="Test Stuff">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding TestItems, RelativeSource={RelativeSource AncestorType=DataGrid}}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
如果在我的 DataGrid 绑定上关闭,也许会有什么问题?这是数据网格:
<DataGrid ItemsSource="{Binding UsersList.Users}"
AutoGenerateColumns="False"
GridLinesVisibility="All"
FontSize="12"
Margin="0"
HorizontalAlignment="Center"
BorderThickness="0">
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}"
BasedOn="{StaticResource MetroDataGridRow}">
</Style>
</DataGrid.RowStyle>
<DataGrid.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Grid Background="{TemplateBinding Background}">
<ContentPresenter VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGrid.CellStyle>
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}"
ClipboardContentBinding="{x:Null}"
behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding TestItems, RelativeSource={RelativeSource AncestorType=DataGrid}}"
Header="Name" />
<DataGridTextColumn Binding="{Binding ID}"
ClipboardContentBinding="{x:Null}"
Header="User ID" />
<DataGridCheckBoxColumn Binding="{Binding Valid}"
ElementStyle="{DynamicResource MetroDataGridCheckBox}"
ClipboardContentBinding="{x:Null}"
Header="Valid Name" />
<DataGridTemplateColumn Header="Test Stuff">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding TestItems, RelativeSource={RelativeSource AncestorType=DataGrid}}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
您应该使用该行为,可能您的行的 DataContext 存在问题。
按照此答案更新您从 DataGrid 获取 DataContext 的行为绑定:Bind to DataContext Property from within DataGridColumn
如果有人仍然对这个主题感兴趣,有一种简单的方法可以将自动完成绑定到 datagridtextcolumn。 使用来自 https://github.com/Nimgoble/WPFTextBoxAutoComplete 的 AutoCompleteBehavior 并使用 https://thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/
中的 BindingProxy class...
xmlns:behaviors="clr-namespace:WPFTextBoxAutoComplete;assembly=WPFTextBoxAutoComplete"
...
<DataGrid Name="dataGrid">
<DataGrid.Resources>
<local:BindingProxy x:Key="proxy" Data="{Binding}" />
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header = "Target" Binding = "{Binding Target}">
<DataGridTextColumn.EditingElementStyle>
<Style TargetType="{x:Type TextBox}">
<Setter Property="behaviors:AutoCompleteBehavior.AutoCompleteItemsSource"
Value="{Binding Data, Source={StaticResource proxy}}" />
</Style>
</DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
...
InitializeComponent();
BindingProxy bindingProxy = dataGrid.Resources["proxy"] as BindingProxy;
var list = new List<string>();
list.Add("abc");
list.Add("bcd");
bindingProxy.Data = list;
....