【发布时间】:2010-07-16 10:12:17
【问题描述】:
我有一个列表视图(在扩展选择模式下并与当前项目同步)和一个文本框。文本框允许用户输入搜索条件。在列表框的 TextChanged 事件中,我将搜索条件与列表视图中的列表视图项的名称相匹配,并相应地设置 selectedindex。这是为了突出显示它并提供一个简单的选择点以从中选择更多点。请看下面的代码:
void searchTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
try
{
TextBox textBox = (TextBox)sender;
if (textBox != null)
{
string text = textBox.Text;
if (text != string.Empty)
{
for (int i = 0; i < listViewPerson.Items.Count; i++)
{
Person person = (Person)listViewPerson.Items[i];
if (person != null)
{
if (person .Name.StartsWith(text, StringComparison.OrdinalIgnoreCase))
{
listViewPerson.SelectedIndex = i;
listViewPerson.ScrollIntoView(routePoint);
break;
}
}
}
}
else
{
listViewPerson.SelectedIndex = -1;
}
}
}
catch (Exception Caught)
{
Log.AddExceptionEntry(this, "Could not search ", Caught, Log.Target.All,
Log.EntryType.Error);
}
}
搜索和选择工作正常。在第一次尝试时,用户可以选择第二个点(第一个点已被搜索选择)并从第一个点进行多选而不会出现问题。
然而第二轮列表视图继续“记住”第一次搜索中的第一个选定点(最初由搜索例程设置),因此导致选择从错误的位置开始(即使 selectedindex 是正确的设置为列表视图中的新项目)。
但是,鼠标单击 selectedindex 会导致选择点被正确重置。与使用手动点击相比,selectedindex 在代码中的工作方式似乎有所不同。
我尝试使用 listViewTrainServiceHelperPattern.SelectedItems.Clear(), SelectedValue(object) 代替 SelectedIndex,但都无济于事。有谁知道是什么原因造成的以及如何解决它?
【问题讨论】:
-
我已经阅读了几遍,但仍然对一些缺失的信息感到有些困惑。选择第二个“点”是什么意思,以及什么动作或事件在“第二次围绕列表视图”开始。如果您选择了多个项目,“selectedindex”将返回第一个选择的索引,而不是最近选择的索引。但是,根据您的问题,我无法判断您的搜索引擎第一次运行和“第二次”之间会发生什么。是否所有项目都被清除,您是否执行自定义逻辑...?
-
什么是
routePoint?似乎这可能存在于对该事件的调用中。此外,这段代码对我来说看起来不是很“MVVM”,因为它在代码隐藏而不是视图模型中具有视图逻辑。如果您在使用 MVVM 实时处理TextChanged时遇到问题,请在您的绑定中尝试:UpdateSourceTrigger=PropertyChanged