c# - 带有 CollectionViewSource 的 WPF ListView 未在 ViewModel 中获取 SelectedItem

标签 c# wpf listview mvvm

我有一个 ListView 我正在使用 CollectionViewSource 进行分组,但我似乎无法将所选项目重新放入 ViewModel。我需要做什么才能获得用户选择的项目?
SelectedItem="{Binding SelectedComparatorGroupItem}"在使用 collectionviewSource 时似乎不起作用,我尝试了 IsSynchronizedWithCurrentItem="True"但这没有帮助。

                <Grid>
                    <Grid.Resources>
                        <CollectionViewSource x:Key="NumberGroups"
                                              Source="{Binding Path=ComparatorGroupItemList}">
                            <CollectionViewSource.GroupDescriptions>
                                <PropertyGroupDescription PropertyName="Group" />
                            </CollectionViewSource.GroupDescriptions>
                        </CollectionViewSource>
                    </Grid.Resources>
                    <ListView x:Name="lvNumbers"
                              DataContext="{StaticResource NumberGroups}"
                              ItemsSource="{Binding IsAsync=True}"
                              IsSynchronizedWithCurrentItem="True"
                              SelectedItem="{Binding SelectedComparatorGroupItem}"
                              VirtualizingPanel.IsContainerVirtualizable="True"
                              VirtualizingPanel.IsVirtualizing="True"
                              VirtualizingPanel.IsVirtualizingWhenGrouping="True">           
                          
                        <ListView.View>
                            <GridView>
                                <GridViewColumn Header="Number" DisplayMemberBinding="{Binding Number}"/>
                                <GridViewColumn Header="# Found" DisplayMemberBinding="{Binding NumberFound}"/>
                            </GridView>
                        </ListView.View>
                        <ListView.GroupStyle>
                            <GroupStyle>
                                <GroupStyle.ContainerStyle>
                                    <Style TargetType="{x:Type GroupItem}">
                                        <Setter Property="Template">
                                            <Setter.Value>
                                                <ControlTemplate>
                                                    <Expander IsExpanded="False">
                                                        <Expander.Header>
                                                            <StackPanel Orientation="Horizontal">
                                                                <TextBlock Text="{Binding Name}"
                                                                           Margin="3"
                                                                           FontSize="18" FontWeight="Bold"
                                                                           />
                                                                <TextBlock Text="{Binding ItemCount}"
                                                                           Margin="3"
                                                                           FontSize="18" FontWeight="Bold"
                                                                           />
                                                            </StackPanel>
                                                        </Expander.Header>
                                                        <ItemsPresenter/>
                                                    </Expander>
                                                </ControlTemplate>
                                            </Setter.Value>
                                        </Setter>
                                    </Style>
                                </GroupStyle.ContainerStyle>
                            </GroupStyle>
                        </ListView.GroupStyle>
                    </ListView>
                </Grid>

最佳答案

您设置 DataContextListView到您本地的CollectionViewSource .这意味着绑定(bind) SelectedItemSelectedComparatorGroupItem将寻找 SelectedComparatorGroupItem CollectionViewSource 上的属性(property),而不是您的 View 模型。您应该会在输出窗口中看到某种绑定(bind)错误。

不要设置 DataContext ,就让它自然流过。您需要做的就是绑定(bind) ItemsSourceCollectionViewSource .

我认为这会做到,但我没有打开 VS 或访问您的 ViewModel 来验证:

<ListView x:Name="lvNumbers"
    ItemsSource="{Binding Source={StaticResource NumberGroups}, IsAsync=True}"
    IsSynchronizedWithCurrentItem="True"
    SelectedItem="{Binding SelectedComparatorGroupItem}"
    VirtualizingPanel.IsContainerVirtualizable="True"
    VirtualizingPanel.IsVirtualizing="True"
    VirtualizingPanel.IsVirtualizingWhenGrouping="True"> 

作为一般规则,如果您曾经设置 DataContext某些事情,你没有按照 WPF 希望你做的方式去做。通常我最终设置它的唯一地方是当我懒惰使用 UserControl .

关于c# - 带有 CollectionViewSource 的 WPF ListView 未在 ViewModel 中获取 SelectedItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44737415/

相关文章:

c# - 如何阻止从 Controller 继承的类的 OnActionExecuting 中执行操作

c# - Task.WaitAny 的最大任务?

c# - 将 StaticResource 的值传递给组合字符串中的 ConverterParameter

java - 具有 2 种颜色的 ListView 不交错

asp.net - 向 ListView 中的 LinkBut​​ton 添加多个动态类

c# - 无法将 Statement Lambda 放入 LINQ 查询中

c# - 拖放到桌面/资源管理器

wpf - 当我按“开始”时,Visual Studio 2012 不会启动应用程序

c# - 在 WPF/C# 中,如何检查中心按钮是否被单击或释放?

android - Android 中 ListView 的 setBackgroundDrawable