2

让我先介绍一下我当前的设置:我有一个 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);
        }
    }

中介消息广播根本不做与这些控件/这个问题相关的任何事情。

4

0 回答 0