单击组名时 CollectionViewSource 取消选择 selectedItem

CollectionViewSource unselect selectedItem when clicking a group name

我有一个 listbox,它的 itemSource 绑定到一个 collectionViewSource,该 collectionViewSource 已分组并且在实际项目上有 2 级分组:

        <ListBox ItemsSource="{Binding Source={StaticResource myCVS}}" ItemTemplate="{StaticResource myItemsTemplate}" ItemContainerStyle="{StaticResource myItemsStyle}" SelectedItem="{Binding SelectedListItem}" >
            <ListBox.GroupStyle>
                <GroupStyle ContainerStyle="{StaticResource HeaderStyle}" />
                <GroupStyle ContainerStyle="{StaticResource SubHeaderStyle}" />
            </ListBox.GroupStyle>
        </ListBox>

CollectionViewSource 绑定到 ObservabeleCollection:

       <CollectionViewSource x:Key="myCVS" Source="{Binding Path=myItemsToGroup}">
            <CollectionViewSource.GroupDescriptions>
                <PropertyGroupDescription PropertyName="HeaderName" />
                <PropertyGroupDescription PropertyName="SubHeaderName" />
            </CollectionViewSource.GroupDescriptions>
        </CollectionViewSource>

ObservalbleCollection 中的项目看起来像:

public class Items
{
    public string GroupName;
    public string SubGroupName;
    public string ItemName;
}

这一切都很好,我最终得到了:

Header1
 |_SubHeader1
     |_item1
     |_item2
Header2
 |_SubHeader2
     |_item1
     |_item2

问题是,如果我单击一个项目,它会变为选中状态,如果我单击 header 或子 header,它会保持选中状态。如果单击 header,我想将 SelectedItem 设置为空。我正在使用命令从 UI 中删除 SelectedItem,但我不希望仅在 header 或子 header 被单击时执行命令一个项目被点击。

GroupStyles 是不可选择的,因此您的视图模型当然不会看到选择发生变化。

要解决此问题,您可以在后面使用一些代码。您会注意到,如果单击 ListBox 中的项目,则 ListBoxItem 会将 MouseUp 事件的 Handled 属性 设置为 true。如果您单击 ListBox 上的任何其他位置,则不会处理该事件。话虽如此,您可以根据 Handled.

的状态设置您选择的项目

XAML:

<ListBox ItemsSource="{Binding Source={StaticResource myCVS}}"
         ItemTemplate="{StaticResource myItemsTemplate}"
         ItemContainerStyle="{StaticResource myItemsStyle}"
         SelectedItem="{Binding SelectedListItem}"
         MouseLeftButtonUp="ListBox_MouseLeftButtonUp">

代码隐藏:

private void ListBox_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    if(!e.Handled)
    {
        var lb = sender as ListBox;
        lb.SelectedItem = null;
    }
}

附录:

单击已选择的项目会将 SelectedItem 设置为空。为防止这种情况,请执行以下操作:而不是使用 MouseLeftButtonUp 使用 MouseDown:

<ListBox ItemsSource="{Binding Source={StaticResource myCVS}}"
         SelectedItem="{Binding SelectedListItem}"
         MouseDown="ListBox_MouseLeftButtonUp">

Here 是我当前应用程序的状态(GroupStyle's)没有正确绘制,但这里的实现很重要。如果这不适合您,我将实施纯 MVVM 方法。