Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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# 自动完成框-检测输入的“新”项_C#_Wpf_Mvvm_Autocomplete - Fatal编程技术网

C# 自动完成框-检测输入的“新”项

C# 自动完成框-检测输入的“新”项,c#,wpf,mvvm,autocomplete,C#,Wpf,Mvvm,Autocomplete,我正在开发一个MVVM WPF应用程序,其中一个要求的功能是一个自动完成框,它过滤选择的项目,允许用户开始键入一个项目,以快速找到并选择正确的项目,使用自动完成框相对容易 但是,还需要检测用户何时键入不存在的项,然后创建该项。但是,我在解决如何检测用户何时输入与项目不匹配的文本时遇到了问题 我试图绑定到text属性,并在autocompletebox失去焦点时触发一个事件,然后检查所选属性是否已设置(如果未使用文本创建新项目)。但是,如果用户输入文本,选择和项,然后将文本更改为不存在的项,则会导

我正在开发一个MVVM WPF应用程序,其中一个要求的功能是一个自动完成框,它过滤选择的项目,允许用户开始键入一个项目,以快速找到并选择正确的项目,使用自动完成框相对容易

但是,还需要检测用户何时键入不存在的项,然后创建该项。但是,我在解决如何检测用户何时输入与项目不匹配的文本时遇到了问题

我试图绑定到text属性,并在autocompletebox失去焦点时触发一个事件,然后检查所选属性是否已设置(如果未使用文本创建新项目)。但是,如果用户输入文本,选择和项,然后将文本更改为不存在的项,则会导致问题。 这将导致SelectedItem和Text都被设置为新的内容

所以我想要的是:

允许用户输入文本,然后按tab/return键选择列表中的第一个匹配项 如果在用户点击return/tab时没有匹配的项目,请使用该名称创建一个新项目 看起来应该很明显/很简单,因为我认为这并不少见,但是我还没有找到一种合理的方法来做到这一点,不需要黑客代码或编写自定义自动完成框,如果有人知道现有控件可以实现这一点,我宁愿避免这样做,或者是一种方法

根据要求,以下是我使用的代码

查看代码:

<Utils:AutoCompleteFocusableBox MaxWidth="200" Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="5"
          ItemsSource="{Binding ItemsList}"
          IsTextCompletionEnabled="True"
          FilterMode="Contains"                          
          x:Name="ACBox"
          LostFocus="ACBox_LostFocus"                         
          Text="{Binding ItemText, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"                           
          SelectedItem="{Binding ItemInfo, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"/>
ViewModel中的事件处理程序,以及检查项的方法

public void Handle(SearchTextEvent message)
    {
        CheckItem(message.Text);
    }

    private void CheckItem(string itemName)
    {
        if (ItemInfo == null)
        {
            if (ItemsList.Where(x => x.ItemName == itemName).Count() < 1)
            {
                ItemInfo = new ItemInfo(0, itemName, null);
                NewItemVisibility = Visibility.Visible;
            }
            else
            {
                NewItemVisibility = Visibility.Hidden;
                ItemInfo ii = ItemRepository.GetItemByName(itemName);
                ItemInfo = ii;
            }
        }
        else
        {
        }
    }

分享一些代码,你是如何试图解决的。我不确定你想要什么代码,这都是很标准的,但我会发布任何方式,你可以创建附加行为,这样你就可以在常规文本框上也有这种行为。在这种方法中,您可能不需要将事件从视图硬连接到代码隐藏,一切都是即插即用的,可以通过样式等进行设置。
 public string ItemText
    {
        get { return _itemText; }
        set
        {
            _itemText = value;
            NotifyOfPropertyChange(() => ItemText);
        }
    }

public ItemInfo ItemInfo
        {
            get { return _itemInfo; }
            set 
            {
                if(_itemInfo != value)
                {
                    _itemInfo = value;
                    NotifyOfPropertyChange(() => ItemInfo);
                }
            }
        }
public void Handle(SearchTextEvent message)
    {
        CheckItem(message.Text);
    }

    private void CheckItem(string itemName)
    {
        if (ItemInfo == null)
        {
            if (ItemsList.Where(x => x.ItemName == itemName).Count() < 1)
            {
                ItemInfo = new ItemInfo(0, itemName, null);
                NewItemVisibility = Visibility.Visible;
            }
            else
            {
                NewItemVisibility = Visibility.Hidden;
                ItemInfo ii = ItemRepository.GetItemByName(itemName);
                ItemInfo = ii;
            }
        }
        else
        {
        }
    }