数据绑定 ListBox SelectedItems 属性

Databinding the ListBox SelectedItems attribute

我知道 ListBox 同时具有 SelectedItem 和 SelectedItems 属性,并且只有 SelectedItem 属性可用于数据绑定。但是,我已经在多个位置阅读过通过设置 setter 这样的

<ListBox.ItemContainerStyle>
     <Style TargetType="ListBoxItem">
          <Setter Property="IsSelected" Value="{Binding IsSelected}" />
     </Style>
</ListBox.ItemContainerStyle>

然后添加以下内容属性

public IEnumerable<Item> SelectedItems
{
     get
     {
          return Items.Where(x => x.IsSelected);
     }
}

我可以使用 SelectedItems 属性 来获取所有被选中的项目。我主要有两个问题:

  1. 属性中的Item和Item从何而来?我一直无法找到一个 using 指令来消除阻止我使用它的错误。

  2. 这是实现我想要实现的目标的推荐方法吗?如果没有,那么你会推荐什么?

哦,在我忘记之前我想我应该提到我同时使用 MVVM Light 和 Fody 的 PropertyChanged。

我不太确定这些文章及其具体解决方案,但我的推测是:

  1. 整个页面有一个名为 MyPageViewModel 的 ViewModel。
  2. MyPageViewModel 有一个名为 ItemsObservableCollection
  3. Item 是 ViewModel 类型(派生自 DependencyObject
  4. Item 有一个名为 IsSelected
  5. DependencyProperty

根据这些假设,您可以了解所有事物的适用范围。


如果整个页面的DataContext是MyPageViewModel,那么在这段xaml代码中,首先IsSelected引用了ListBoxItem的一个属性,然后第二个引用 Item.

的 ViewModel 中的 属性
<ListBox ItemsSource="{Binding Items}">
    <ListBox.ItemContainerStyle>
         <Style TargetType="ListBoxItem">
              <Setter Property="IsSelected" Value="{Binding IsSelected}" />
         </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

//This is inside MyPageViewModel
//Item is a ViewModel type
public IEnumerable<Item> SelectedItems
{
     get
     {
          //Items is ObservableCollection<Item>
          return Items.Where(x => x.IsSelected);
     }
}

//This is also inside MyPageViewModel
private ObservableCollection<Item> _items = new ObservableCollection<Item>();
public ObservableCollection<Item> Items { get { return _items; } } 

整个场景也可以反过来。我的意思是它可以在 View 而不是 ViewModel 中实现。也许从 ListBox 派生并覆盖一些东西,包括 SelectedItems。但是添加这些复杂性对 ViewModel 比 View 更好。