WPF:ListView SelectedItem绑定工作一瞬间,然后更改回来

时间:2013-08-21 14:18:11

标签: c# .net wpf

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

调解员消息广播根本不做与这些控制有关的任何事情/这个问题。

0 个答案:

没有答案