在ObservableCollection上执行选择

时间:2017-12-06 10:39:25

标签: c# wpf linq data-binding observablecollection

同样地,我可以使用集合的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并根据需要更新它来实现我想要的结果,但我想知道是否有更优雅的解决方案。

干杯!

1 个答案:

答案 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();
    }
}

enter image description here enter image description here

使用的资源包括ObservableCollection<Food> FoodItemsList<Food> SelectedFoodItems。也许不是最优雅的,但应该根据需要在SelectedItem列表之间轻松切换。