数据绑定ListBox SelectedItems属性

时间:2015-02-14 15:58:54

标签: c# wpf mvvm data-binding listbox

我知道ListBox同时具有SelectedItem和SelectedItems属性,并且只有SelectedItem属性可以与数据绑定一起使用。但是,我通过设置像这样的设置器来读取多个位置

<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. 物业中的物品和物品来自哪里?我找不到使用指令来删除阻止我使用它的错误。

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

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

1 个答案:

答案 0 :(得分:1)

我对这些文章及其确切解决方案不太确定,但我猜测是这样的:

  1. 整个页面都有一个名为MyPageViewModel
  2. 的ViewModel
  3. MyPageViewModel有一个名为ObservableCollection的{​​{1}}。
  4. Items是ViewModel类型(派生自Item
  5. DependencyObjectItem名为DependencyProperty
  6. 考虑到这些假设,你可以看到所有事情都适合。


    如果整个页面的DataContext是IsSelected,则在此xaml代码中,MyPageViewModel引用IsSelected的属性,第二个引用ViewModel中的属性ListBoxItem

    Item

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

    整个场景也可以反过来。我的意思是它可以在View而不是ViewModel中实现。也许从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; } } 。但是,对于ViewModel来说,添加这些复杂性比View更好。