我有一个带有DataTemplates的ItemsControl,其中包含带有ItemsSource的ListBox,它们都绑定到相同类型的不同ObservableCollections,每个ListBox的SelectedItem绑定到引发PropertyChanged的相同属性,以便我的UserControl的其他可视元素将使用SelectedItem的详细信息进行更新
除了ListBox只有一个项目的情况外,一切都很有效。当我第一次单击该单个项目时,PropertyChanged会像您期望的那样被提升。如果我点击另一个ListBox中的项目,一切仍然很好。但是,当单击已经选择一次的ListBox中的单个项目时 - 它不会告诉SelectedItem我们实际上已经选择了一个新项目,因为就ListBox而言,它是相同的项目。
我正在寻找一种处理这种情况的简洁方法。有什么想法吗?
答案 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;
}