同样地,我可以使用集合的ICollectionView上的Filter属性从我的ObservableCollection中过滤项目,是否也可以对集合执行选择(与Linq一样)?
举个例子,假设我有一个Food
对象的列表,它没有Selected
属性,但我维护在一个单独的列表中选择哪些食物。理想情况下,我想像我这样执行我的选择:
view.Select(f => return new { Food = f, Selected = selectedFood.Contains(f)});
然后我可以绑定到此Select返回的项目,如下所示:
<ListBox ItemsSource="{Binding FoodView}">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Selected}">
<TextBlock Text="{Binding Food.Name}"/>
</CheckBox>
</DataTemplate>
</ListBox.ItemTemplate>
我目前正在通过维护单独的ObservableCollections并根据需要更新它来实现我想要的结果,但我想知道是否有更优雅的解决方案。
干杯!
答案 0 :(得分:1)
我不确定这是否是您正在寻找的但是我创建了一个IMultiValueConverter
,它接受两个绑定,第一个是当前数据对象,第二个是所选项目列表:
<ListBox ItemsSource="{Binding FoodItems}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox>
<CheckBox.IsChecked>
<MultiBinding Converter="{StaticResource ListExistsConverter}" Mode="OneWay">
<Binding/>
<Binding Path="DataContext.SelectedFoodItems" RelativeSource="{RelativeSource AncestorType=UserControl}"/>
</MultiBinding>
</CheckBox.IsChecked>
</CheckBox>
<TextBox Text="{Binding Name}" Width="50" Height="20"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
转换器:
class ListExistsConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values == null) return null;
var item = values[0] as Food;
var list = values[1] as List<Food>;
return list.Contains(item);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
使用的资源包括ObservableCollection<Food> FoodItems
和List<Food> SelectedFoodItems
。也许不是最优雅的,但应该根据需要在SelectedItem列表之间轻松切换。