从ListBox中取消选择项目,以便在单击时调用NotifyPropertyChanged

时间:2010-09-10 23:20:00

标签: wpf user-interface mvvm

我有一个带有DataTemplates的ItemsControl,其中包含带有ItemsSource的ListBox,它们都绑定到相同类型的不同ObservableCollections,每个ListBox的SelectedItem绑定到引发PropertyChanged的相同属性,以便我的UserControl的其他可视元素将使用SelectedItem的详细信息进行更新

除了ListBox只有一个项目的情况外,一切都很有效。当我第一次单击该单个项目时,PropertyChanged会像您期望的那样被提升。如果我点击另一个ListBox中的项目,一切仍然很好。但是,当单击已经选择一次的ListBox中的单个项目时 - 它不会告诉SelectedItem我们实际上已经选择了一个新项目,因为就ListBox而言,它是相同的项目。

我正在寻找一种处理这种情况的简洁方法。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

对于像这样的更多涉及的场景,我个人不会使用ListBox。 我只是在对象上实现一个IsSelectable接口(只有一个IsSelected属性)。然后我使用一种SelectionContextService来注册那些视图模型/对象,以允许在视图上进行多个独立选择,并处理对新选择和这样的东西的多选/取消选择。在viewmodels的datatemplates(基本视图)中,我使用一些附加属性来定义选择行为(当DataContext是ISelectable时,大多只是将MouseDown事件连接到状态更改)。 这基本上是手动完成所有操作,但我发现很容易处理遍布整个视图的树视图或可选对象。

答案 1 :(得分:0)

单击ListBox的项目时,无论它是否已被选中,ListBox的 GotFocus 事件在SelectedItem更改之前被触发 - 假设ListBox没有焦点。因此,在 GotFocus 事件中将SelectedItem设置为null会刷新SelectedItem。

XAML:

<ItemsControl  ItemsSource="{Binding Path=ParentCollection}">
   <ItemsControl.ItemTemplate>
      <DataTemplate>                                        
           <ListBox GotFocus="ListBox_GotFocus"
                    ItemsSource="{Binding ChildCollection}"
                    SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MyView} }, Path=DataContext.SelectedChild}"/>
      </DataTemplate>   
    </ItemsControl.ItemTemplate>
</ItemsControl>

代码背后:

private void ListBox_GotFocus(object sender, RoutedEventArgs e)
{
   ((ListBox)sender).SelectedItem = null;
}