【问题标题】:WPF ListView with CollectionViewSource not getting SelectedItem in ViewModel带有 CollectionViewSource 的 WPF ListView 未在 ViewModel 中获取 SelectedItem
【发布时间】:2017-06-24 14:24:48
【问题描述】:

我有一个 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>

【问题讨论】:

  • SelectedComparatorGroupItem 是什么?

标签: c# wpf listview mvvm


【解决方案1】:

您将ListViewDataContext 设置为本地CollectionViewSource。这意味着将SelectedItem 绑定到SelectedComparatorGroupItem 将在CollectionViewSource 上查找SelectedComparatorGroupItem 属性,不是您的视图模型。您应该会在输出窗口中看到某种绑定错误。

不要设置DataContext,让它自然流过。您需要做的就是将ItemsSource 绑定到CollectionViewSource

认为可以这样做,但我没有打开 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时。

【讨论】:

  • 谢谢,把它放在一起测试我正在构建的插件。代码盲了!
猜你喜欢
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
  • 2011-01-18
  • 2011-02-06
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多