C# 自动完成框-检测输入的“新”项
我正在开发一个MVVM WPF应用程序,其中一个要求的功能是一个自动完成框,它过滤选择的项目,允许用户开始键入一个项目,以快速找到并选择正确的项目,使用自动完成框相对容易 但是,还需要检测用户何时键入不存在的项,然后创建该项。但是,我在解决如何检测用户何时输入与项目不匹配的文本时遇到了问题 我试图绑定到text属性,并在autocompletebox失去焦点时触发一个事件,然后检查所选属性是否已设置(如果未使用文本创建新项目)。但是,如果用户输入文本,选择和项,然后将文本更改为不存在的项,则会导致问题。 这将导致SelectedItem和Text都被设置为新的内容 所以我想要的是: 允许用户输入文本,然后按tab/return键选择列表中的第一个匹配项 如果在用户点击return/tab时没有匹配的项目,请使用该名称创建一个新项目 看起来应该很明显/很简单,因为我认为这并不少见,但是我还没有找到一种合理的方法来做到这一点,不需要黑客代码或编写自定义自动完成框,如果有人知道现有控件可以实现这一点,我宁愿避免这样做,或者是一种方法 根据要求,以下是我使用的代码 查看代码:C# 自动完成框-检测输入的“新”项,c#,wpf,mvvm,autocomplete,C#,Wpf,Mvvm,Autocomplete,我正在开发一个MVVM WPF应用程序,其中一个要求的功能是一个自动完成框,它过滤选择的项目,允许用户开始键入一个项目,以快速找到并选择正确的项目,使用自动完成框相对容易 但是,还需要检测用户何时键入不存在的项,然后创建该项。但是,我在解决如何检测用户何时输入与项目不匹配的文本时遇到了问题 我试图绑定到text属性,并在autocompletebox失去焦点时触发一个事件,然后检查所选属性是否已设置(如果未使用文本创建新项目)。但是,如果用户输入文本,选择和项,然后将文本更改为不存在的项,则会导
<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
{
}
}