C# WPF组合框-在控件具有焦点时通过绑定设置文本

C# WPF组合框-在控件具有焦点时通过绑定设置文本,c#,wpf,xaml,combobox,C#,Wpf,Xaml,Combobox,好吧,我放弃了,需要一些帮助 我正在努力让WPF组合框按我所希望的方式运行!为了简单地描述这个问题,我有一个组合框,当用户在其中输入内容时,可以限制它的内容。例如,当他们在框中输入C时,组合框的项目仅限于以C开头的项目。一切都很好。我遇到的问题是,当框中只剩下1个选项时,我希望只剩下一个选项可供选择,并将组合框的文本设置为该选项。它可以很好地选择项目,但我无法根据需要更新组合框的文本。以下是组合框的XAML: <ComboBox x:Name="CustomerBox" IsEdi

好吧,我放弃了,需要一些帮助

我正在努力让WPF组合框按我所希望的方式运行!为了简单地描述这个问题,我有一个组合框,当用户在其中输入内容时,可以限制它的内容。例如,当他们在框中输入C时,组合框的项目仅限于以C开头的项目。一切都很好。我遇到的问题是,当框中只剩下1个选项时,我希望只剩下一个选项可供选择,并将组合框的文本设置为该选项。它可以很好地选择项目,但我无法根据需要更新组合框的文本。以下是组合框的XAML:

    <ComboBox x:Name="CustomerBox" IsEditable="True" ItemsSource="{Binding Customers}" 
              SelectedItem="{Binding SelectedCustomer, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
              SelectedValue="{Binding SelectedCustomer.AccountCode, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
              SelectedValuePath="AccountCode"
              Text="{Binding CustomerBoxText, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
              PreviewKeyDown="CustomerBox_PreviewKeyDown">
GetCustomerData通过更改combobox绑定到的Customers集合来限制框的内容。代码是这样的:

    private void GetCustomerData(string accountCode = "")
    {
        List<Customer> customers = (Helpers.DataStorage.Instance.GetData<Customer>(accountCode) as List<Customer>).OrderBy(x => x.AccountCode).ToList();
        this.Customers = new ObservableCollection<Customer>(customers);
        // If only 1 item in list then we make it the selected item
        if (this.Customers.Count == 1)
        {
            SelectedCustomer = Customers[0];
            CustomerBoxText = SelectedCustomer.AccountCode;
        }
        else
        {
            SelectedCustomer = Customers.FirstOrDefault(c => c.AccountCode == accountCode);
        }
    }
SelectedCustomer更新得足够好,我可以看到其他绑定中的值。但是,正在更新的CustomerBoxText不会更新在组合框中键入的值。我使用snoop确认Text属性是预期的值,但它不是ComboBox本身中显示的值


有什么想法吗?

只是一个建议,但我会从wpftoolkit中查看AutoCompleteBox,而不是尝试用ComboBox实现它。谢谢你的建议,但我似乎在WPF工具包中找不到AutoCompleteBox。我以前没用过,所以也许我在最后的评论中遗漏了什么。结果发现有很多东西的名字和wpftoolkit相似,我搞错了!我会看看它是否符合我的需要在你发布的代码中,我会担心你可能会递归地设置CustomerBoxText属性。虽然它可能不是无界递归,但如果代码不是为重入而设计的,它仍然可能导致问题。这就是说,如果您仍然发现您在这个问题上需要帮助,请提供可靠的重现问题的信息。如果您不能或不愿意提供一个好的代码示例,请关闭和/或删除该问题。递归是我关心的问题,但在我知道它是否会发挥作用之前,我不会担心。如果您设置文本属性,而它有焦点,我应该期望看到更改吗?我窥探了该控件,文本属性如预期的那样,即它是完整的AccountCode,但在该控件中,我只看到了我键入的部分文本。这对我来说似乎很奇怪,combobox的文本属性怎么可能只有一个值,但却显示了一个不同的值,我不知道我是做错了什么,还是问combobox一些它不能做的事情。
    private void GetCustomerData(string accountCode = "")
    {
        List<Customer> customers = (Helpers.DataStorage.Instance.GetData<Customer>(accountCode) as List<Customer>).OrderBy(x => x.AccountCode).ToList();
        this.Customers = new ObservableCollection<Customer>(customers);
        // If only 1 item in list then we make it the selected item
        if (this.Customers.Count == 1)
        {
            SelectedCustomer = Customers[0];
            CustomerBoxText = SelectedCustomer.AccountCode;
        }
        else
        {
            SelectedCustomer = Customers.FirstOrDefault(c => c.AccountCode == accountCode);
        }
    }
        if (this.Customers.Count == 1)
        {
            SelectedCustomer = Customers[0];
            CustomerBoxText = SelectedCustomer.AccountCode;
        }