让我先介绍一下我当前的设置:我有一个 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>
它的项目模板(视图: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>
这里的想法是在编辑相应的 ListView 项时打开 TextBox 并关闭 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);
}
}
中介消息广播根本不做与这些控件/这个问题相关的任何事情。