首先介绍我目前的设置: 我有一个ListView,它将其SelectedItem属性绑定到ViewModel,如下所示:
<ListView Name="FileListView" ItemsSource="{Binding ImageList}"
SelectionChanged="ImageSelectionChanged"
SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
SelectionMode="Single">
<ListView.ItemTemplate>
<DataTemplate>
<view:FileListItem />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
它的项目模板(view:FileListItem)如下:
<Grid MouseDown="FileListItemMouseDown" KeyDown="FileListItemKeyDown">
....
<TextBlock Name="NewNameTextBlock"
Text="{Binding NewName}"
Grid.Column="2"
Visibility="{Binding TextBlockVisibility}" />
<TextBox Name="NewNameTextBox"
Text="{Binding NewName, UpdateSourceTrigger=PropertyChanged}"
Grid.Column="2"
Visibility="{Binding TextBoxVisibility}" />
</Grid>
这里的想法是打开TextBox并在编辑相应的ListView项时关闭TextBlock。这可以正常工作,但是当我点击某个特定键时,我希望ListView选择下一个项目并将该项目置于编辑模式。我在ItemTemplate中看到KeyDown事件,如上所示,并广播一条消息,该消息在我的ListView的DataContext中被捕获,如下所示:
public ImageFile SelectedItem {
get { return _selectedItem; }
set { _selectedItem = value; NotifyPropertyChanged("SelectedItem"); }
}
public void SelectAndEditThisHandler (object x)
{
ImageFile file = x as ImageFile;
SelectedItem = file;
}
结果是选择实际上会在瞬间更改,但随后会更改回上一个选择。我怀疑其他一些UI元素可能正在处理我的按键并做一些事情来改变选择,但我无法弄清楚哪些元素以及如何精确定位它们。
任何帮助将不胜感激!谢谢!
编辑: 根据要求,SelectionChanged处理程序:
private void ImageSelectionChanged(object sender, SelectionChangedEventArgs e)
{
System.Collections.IList filelist = FileListView.SelectedItems;
if (filelist.Count == 1)
{
ImageFile selectedFile = FileListView.SelectedItem as ImageFile;
Mediator.Instance.NotifyColleagues(Mediator.Operations.ImagePathSelected, selectedFile.OriginalPath);
}
}
调解员消息广播根本不做与这些控制有关的任何事情/这个问题。