如何在我的 DataGrid 中找到我的 WPF 自动完成框?

How can i find my WPF Autocompletebox in my DataGrid?

您好,几天来我一直在尝试将自动完成框集成到我的项目中,但不幸的是没有成功。我有点绝望了。我至少为我的 Datagrid (DotNetProjects.WpfToolkit.Input 6.0.90 https://www.nuget.org/packages/DotNetProjects.WpfToolkit.Input/) but I can't put it in my . I followed the instructions in this video: https://www.youtube.com/watch?v=SK8TXvcPWqI 之外的文本框找到了一个非常简单的解决方案。我将 post 我的代码在这里:

<Grid>
<controls:AutoCompleteBox x:Name="ACB2" Text="TT" ></controls:AutoCompleteBox> 
</Grid>

这个盒子正在工作。我可以在我的代码中找到“ACB2”框:

public Databasewindow()                                                  
        {
            InitializeComponent();
            ACB2.FilterMode = AutoCompleteFilterMode.Contains;
            ACB2.ItemsSource = new string[] { "TEST1", "TEST2 TEST2", "TEST3 TEST3" };

        }

但是当我尝试填充列并使用此框时,我失败了,再也找不到我的文本框了

<Grid>
<DataGrid x:Name="DataGrid1"
    <DataGridTemplateColumn  Width="200" Header=" Command ">
                    <DataGridTemplateColumn.CellTemplate >
                        <DataTemplate>
                            <controls:AutoCompleteBox 
                                Text="{Binding Command, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
                                x:Name="ACB2" 
                                ></controls:AutoCompleteBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
           </DataGrid>
         </Grid>

Binding Text="{Binding Command, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 运行良好。但是我再也找不到我的代码中的 x:Name="ACB2" 了。谁能帮我这个?我尝试了许多不同的 AutoCompleteFunctions (Nuget),但我总是遇到建议绑定问题。也许有人对此有一些经验,可以帮助我吗?那会非常非常好。亲切的问候

有很多方法可以做到这一点,但我会告诉你最简单的。将 x:Name 放入您的 DataGrid 并获取其第一个子项,这样它将成为您的文本框。如果您有更难实现的东西,请查看 MVVM 和 DataBinding...获取信息的途径很长,但在使用 WPF 时了解它是正确的事情。

    public List<string> AutoCompleteBoxItems { get; set; } = new List<string>();
    
    public Databasewindow()                                                  
    {
        InitializeComponent();
    
        AutoCompleteBoxItems.Add("Test1");
        AutoCompleteBoxItems.Add("Test2");
    }

和XAML

        <controls:AutoCompleteBox Text="{Binding Command, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
    ItemsSource="{Binding AutoCompleteBoxItems}"
FilterMode="Contains"></controls:AutoCompleteBox>

您也可以使用此 来查找您的 UIElement,但在 DatGrid.Loaded 事件中执行此操作。您始终可以扩展该方法并找到所有相同的 UIElement,但这同样不是您应该做的。使用 DataBinding insted。强烈推荐。

所以我找到了解决绑定问题的方法。感谢 Melkor V 的支持。这是我的代码:

在我的 Xaml 中,我必须为我的绑定添加这些行:

XAML:

xmlns:controls='clr-namespace:System.Windows.Controls;assembly=DotNetProjects.Input.Toolkit' xmlns:local="clr-namespace:Databases"

在我的 Datagrid 中 => Commandselection 是 Class 我在其中写了一个列表,而 AutoCompleteBoxItems 是列表的名称

<DataGrid 
   <DataGrid.DataContext>
         <local:Commandselection/>
   </DataGrid.DataContext>
</DataGrid>

<DataGridTemplateColumn  Width="200" Header=" Command ">
                    <DataGridTemplateColumn.CellTemplate >
                        <DataTemplate>
                            <controls:AutoCompleteBox 
                                Text="{Binding Command, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
                                ItemsSource="{Binding Path = DataContext.AutoCompleteBoxItems, RelativeSource={RelativeSource AncestorType=DataGrid}}"
                                FilterMode="Contains" 
                                ></controls:AutoCompleteBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

这是我的 Class 的代码:

class Commandselection 
    {

        public static ObservableCollection<string> AutoCompleteBoxItems { get; set; }
        public Commandselection()
        {
            AutoCompleteBoxItems = new ObservableCollection<string>()
            {
                "Apple",
                "Banana",
                "Carrot",
                "Dog",
                "Elderberry",
                "Fruit",
                "Grapes",
                "Honey",
                "Iron"
            };
        }
        
    }