【问题标题】:Using WPF TextBox Autocomplete in a DataGrid在 DataGrid 中使用 WPF 文本框自动完成
【发布时间】:2015-11-24 11:24:27
【问题描述】:

我最近在此处获取了该项目:https://github.com/Nimgoble/WPFTextBoxAutoComplete 它为 WPF 中的文本框添加了自动完成行为。

您将此属性添加到文本框以实现自动完成行为:behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding YourCollection}"

我试图让行为与 DataGridTextColumn 中的文本框一起工作,但没有成功。如何将此属性添加到 DataGridTextColumn 中包含的 TextBox?

谢谢!

编辑:尝试制作 DataTemplate 列,但仍然无效。

        <DataGridTemplateColumn Header="Test Stuff">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBox behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding TestItems,  RelativeSource={RelativeSource AncestorType=DataGrid}}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

如果在我的 DataGrid Binding 上关闭,可能会有什么问题?这是数据网格:

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

【问题讨论】:

    标签: c# wpf xaml autocomplete wpfdatagrid


    【解决方案1】:

    您应该使用该行为,可能您的行的 DataContext 存在问题。

    按照此答案更新您的行为绑定,从 DataGrid 获取 DataContext:Bind to DataContext Property from within DataGridColumn

    【讨论】:

    • TextColumn 单元格已经成功地将数据绑定到字符串属性。这和那个无关吗?
    • 你绑定的textcolumn的字符串属性和AutoCompleteItemsSource是同一个对象的成员吗?
    • 他们是。同一个对象两者都有。我确实使用相同的 ViewModel 使用 TextBox 对此进行了测试(并将 TextBox 与自动完成的集合一起绑定到一个字符串),并且自动完成功能确实有效。除了 DataGridTextColumn 本身之外,我还需要在其他地方放置此属性吗?
    • UsersList.Users 有一个名为 TestItems 的属性?
    • 我才意识到!在发布之后,我注意到我需要引用我的 UserControl 正在使用的 DataContext,而不是我的 DataGrid 正在使用的那个。值得庆幸的是,这很容易,因为我使用的是 StaticResource,直到我能弄清楚如何在 windows 和 UserControls 之间正确使用 DymanicResources。
    【解决方案2】:

    如果有人仍然对这个主题感兴趣,有一种简单的方法可以将自动完成绑定到 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 类

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

    【讨论】:

      猜你喜欢
      • 2010-10-31
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      • 2018-04-03
      相关资源
      最近更新 更多