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

标签 wpf xaml collectionviewsource

我有一个 listbox,其 itemSource 绑定(bind)到 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 绑定(bind)到 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 设置为 null。我正在使用命令从 UI 中删除 SelectedItem,但如果仅在单击某个项目时单击标题或子标题,我不希望执行该命令。

最佳答案

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

要解决此问题,您可以使用一些隐藏代码。您会注意到,如果单击 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's)的状态没有正确绘制,但这里的实现才是重要的。如果这不适合您,我将实现纯 MVVM 方法。

关于wpf - 单击组名称时 CollectionViewSource 取消选择 selectedItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29259701/

相关文章:

c# - 将 ObservableCollection 绑定(bind)为不同 CollectionViewSource 的源

c# - 在 DrawingContext 上绘制时在图像上绘制阴影

WPF:将数据触发器绑定(bind)到属性 "Ischecked"时出现复选框问题

wpf - 需要有关 WPF 中自定义样式的帮助

c# - 以编程方式将项目添加到 ComboBox

WPF CollectionViewSource 分组

.net - WPF 中的 MVVM - UserControls 和 GMap.NET

c# - 如何在 WPF 中释放鼠标左键时触发事件?

silverlight - 在我的PC上使用MVVM-light构建Silverlight项目时出现问题。在其他计算机上

wpf - 在 DataTemplate 中对绑定(bind)的 ItemsControl 进行排序(仅限 XAML)