单击组名称时,CollectionViewSource取消选择selectedItem

时间:2015-03-25 15:20:56

标签: wpf xaml collectionviewsource

我有一个listbox,其itemSource绑定到collectionViewSource,该 <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> 已分组,并且在实际项目上有2个级别的分组:

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

这一切都很有效我最终得到了:

SelectedItem

问题是,如果我单击某个项目,它将被选中,如果我单击标题或子标题,则保持选中状态。如果单击标题,我想将SelectedItem设置为null。我正在使用命令从UI中删除{{1}},但如果仅在单击项目时单击标题或子标题,我不希望执行该命令。

1 个答案:

答案 0 :(得分:2)

GroupStyle s不可选,因此您的视图模型当然不会看到选择更改发生。

要解决此问题,您可以使用一些代码。您会注意到,如果您点击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设置为null。为防止这种情况,请执行以下操作:而不是使用MouseLeftButtonUp使用MouseDown:

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

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