0

我的 WPF 窗口上有一个 ListView,我有一个按钮可以全选。首先,您如何获得按钮来选择列表视图中的所有项目。

其次,我需要我的 ViewModel 来检查所有选定的项目。如何在我的 ViewModel 中获取这些信息?

我读过您可以使用 IsSelected 属性执行此操作,但有一个错误,其中本地属性会覆盖绑定属性,因此如果之前已经选择了它,那么它似乎不会再次被选择 - 或类似的东西。看起来很复杂。研究这个问题的博客

然后我读了这篇博客Data binding to selected items这似乎也很复杂。

我想知道它是否必须如此复杂,并且这些例子是唯一的出路。

XAML:

        <ListView Name="sources_ListView" Grid.RowSpan="1" ItemsSource="{Binding Path=Sources}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Width="290" Header="Name">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Path=OriginalPath}" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Width="80" Header="Type">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Path=Type}" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>

<Button Grid.Row="0" Grid.Column="0" Content="Select All" Name="selectAllSources_Button" Margin="3" />
<Button Grid.Row="0" Grid.Column="1" Content="Deselect All" Name="deselectAllSources_Button" Margin="3" />
<Button Grid.Row="0" Grid.Column="3" Content="Remove Selected" Name="removeSelected_Button" Margin="3" Width="100" HorizontalAlignment="Right" />
4

4 回答 4

3

在您的按钮上附加一个处理程序 -

<Button Click="Button_Click"/>

SelectAll在您的 ListView 实例上调用方法 -

private void Button_Click(object sender, RoutedEventArgs e)
{
   sources_ListView.SelectAll();
}

其次,如果在 View 上选择了所有项目,在这种情况下ItemsSource将始终等于SelectedItems. 因此,只需迭代 ItemsSource 即Sources在您的情况下。

于 2012-11-27T18:37:10.490 回答
0

我创建了一种行为,以允许控件中的属性绑定到项目集合的属性,其方式如下:

  • 如果更改控件中的属性,则会更新所有项。
  • 如果您更改项目中的属性,如果所有项目都具有相同的属性,则控件将反映它。如果没有,控件的属性将被赋予一个后备值(如 null)。

您可以使用它来将 CheckBox.IsChecked 绑定到该类型元素集合中的 IsSelected 类型属性。我向一个想要做与您想要的类似的事情但使用 DataGrid 的人建议它。你可以看看这里

于 2012-11-27T19:26:00.493 回答
0

我很久以前创建了一个附加行为来处理这个问题。它允许您将 SelectedItems 列表绑定到 View Model 上的可观察集合并处理来回穿梭更改。

使用附加行为是将功能扩展到现有控件(而不是子类化控件)的首选方法,否则将需要扩展视图逻辑。

我不会说您应该始终使用这种方法而不是在视图中放置逻辑。但这是一种捕获行为以便于重用的简单方法。

于 2012-11-27T21:29:59.510 回答
0

@ RV1987 感谢您的回答,这绝对是其中很大一部分。但是对于其余部分,我发现这个博客详细说明了如何使用源代码进行操作。绝对值得一读。

坏熵博客

谢谢

于 2012-11-29T11:22:52.593 回答