我知道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属性来获取所选的所有项目。我主要有两个问题:
物业中的物品和物品来自哪里?我找不到使用指令来删除阻止我使用它的错误。
这是我尝试实现的目标的推荐方法。如果没有,那么你会推荐什么?
哦,在我忘记之前我想我应该提到我同时使用MVVM Light和Fody的PropertyChanged。
答案 0 :(得分:1)
我对这些文章及其确切解决方案不太确定,但我猜测是这样的:
MyPageViewModel
。MyPageViewModel
有一个名为ObservableCollection
的{{1}}。Items
是ViewModel类型(派生自Item
)DependencyObject
有Item
名为DependencyProperty
考虑到这些假设,你可以看到所有事情都适合。
如果整个页面的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更好。