单击组名时 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 被单击时执行命令一个项目被点击。
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 设置为空。为防止这种情况,请执行以下操作:而不是使用 MouseLeftButtonUp
使用 MouseDown:
<ListBox ItemsSource="{Binding Source={StaticResource myCVS}}"
SelectedItem="{Binding SelectedListItem}"
MouseDown="ListBox_MouseLeftButtonUp">
Here 是我当前应用程序的状态(GroupStyle
's)没有正确绘制,但这里的实现很重要。如果这不适合您,我将实施纯 MVVM 方法。
我有一个 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 被单击时执行命令一个项目被点击。
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 设置为空。为防止这种情况,请执行以下操作:而不是使用 MouseLeftButtonUp
使用 MouseDown:
<ListBox ItemsSource="{Binding Source={StaticResource myCVS}}"
SelectedItem="{Binding SelectedListItem}"
MouseDown="ListBox_MouseLeftButtonUp">
Here 是我当前应用程序的状态(GroupStyle
's)没有正确绘制,但这里的实现很重要。如果这不适合您,我将实施纯 MVVM 方法。