我有一个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}},但如果仅在单击项目时单击标题或子标题,我不希望执行该命令。
答案 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方法。