我在应用程序中使用WPToolkit的AutoCompleteBox。
XAML如下-
<toolkit:AutoCompleteBox Name="ACB" ValueMemberBinding="{Binding Name}" MinimumPrefixLength="0" IsTextCompletionEnabled="False" SelectionChanged="ACB_SelectionChanged">
<toolkit:AutoCompleteBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="{Binding Color}"/>
</StackPanel>
</DataTemplate>
</toolkit:AutoCompleteBox.ItemTemplate>
</toolkit:AutoCompleteBox>
在以下情况下我需要帮助-
上面的AutoCompleteBox的项源是一个类的对象列表,该类具有两个属性——Name和Color。
现在,当我在框中输入文本时,只需要按名称过滤项目,它们就会被过滤得很好。但是,如果我选择了项目,它就没有被正确选择。
情况如下-
假设有4个项目-
项目1-名称="铅笔",颜色="红色"
项目2-名称="铅笔",颜色="绿色"
项目3-名称="橡皮擦",颜色="红色"
项目4-名称="橡皮擦",颜色="绿色"
现在,我在自动完成框中输入文本"笔"。然后显示前2项。但如果我选择绿色铅笔,则会选择红色铅笔。
也许是因为这两个项目的"名称"都是"铅笔"。但我需要处理这种情况。可以有两个项目具有相同的名称。但是需要选择正确的一个。
我该怎么做?我需要应用一些自定义筛选器吗?如果是,如何?
我认为问题在于通过ValueMemberBinding的绑定。您可以将其删除并改用ItemsSource。为此,您需要创建自己的过滤器,并覆盖对象类的ToString()方法。一个较短的解决方法是不使用自动完成框的选择更改事件,并在每个项目上使用Tap evant
<toolkit:AutoCompleteBox Name="ACB" ValueMemberBinding="{Binding Name}" MinimumPrefixLength="0" IsTextCompletionEnabled="False" >
<toolkit:AutoCompleteBox.ItemTemplate>
<DataTemplate>
<StackPanel Tap="TapEvent">
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="{Binding Color}"/>
</StackPanel>
</DataTemplate>
</toolkit:AutoCompleteBox.ItemTemplate>
在c#:中
private void TapEvent(object sender, RoutedEventArgs e)
{
StackPanel stack = sender as StackPanel;
if (stack == null) return;
MyClass item = stack.DataContext as MyClass;
if (item == null) return;
//here I have the selected item which I want
}