数据绑定 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 属性 来获取所有被选中的项目。我主要有两个问题:
属性中的Item和Item从何而来?我一直无法找到一个 using 指令来消除阻止我使用它的错误。
这是实现我想要实现的目标的推荐方法吗?如果没有,那么你会推荐什么?
哦,在我忘记之前我想我应该提到我同时使用 MVVM Light 和 Fody 的 PropertyChanged。
我不太确定这些文章及其具体解决方案,但我的推测是:
- 整个页面有一个名为
MyPageViewModel
的 ViewModel。
MyPageViewModel
有一个名为 Items
的 ObservableCollection
。
Item
是 ViewModel 类型(派生自 DependencyObject
)
Item
有一个名为 IsSelected
的 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 更好。
我知道 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 属性 来获取所有被选中的项目。我主要有两个问题:
属性中的Item和Item从何而来?我一直无法找到一个 using 指令来消除阻止我使用它的错误。
这是实现我想要实现的目标的推荐方法吗?如果没有,那么你会推荐什么?
哦,在我忘记之前我想我应该提到我同时使用 MVVM Light 和 Fody 的 PropertyChanged。
我不太确定这些文章及其具体解决方案,但我的推测是:
- 整个页面有一个名为
MyPageViewModel
的 ViewModel。 MyPageViewModel
有一个名为Items
的ObservableCollection
。Item
是 ViewModel 类型(派生自DependencyObject
)Item
有一个名为IsSelected
的
DependencyProperty
根据这些假设,您可以了解所有事物的适用范围。
如果整个页面的DataContext是MyPageViewModel
,那么在这段xaml代码中,首先IsSelected
引用了ListBoxItem
的一个属性,然后第二个引用 Item
.
<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 更好。