【问题标题】:Perform a Select on an ObservableCollection对 ObservableCollection 执行选择
【发布时间】:2017-12-06 10:39:24
【问题描述】:

以同样的方式,我可以使用集合的 ICollectionView 上的 Filter 属性过滤 ObservableCollection 中的项目,是否也可以对集合执行 Select(与 Linq 一样)?

例如,假设我有一个没有 Selected 属性的 Food 对象列表,但我在单独的列表中维护了哪些食物被选中。理想情况下,我希望像这样执行我的 Select:

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 并根据需要更新它们来实现我想要的结果,但我想知道是否有更优雅的解决方案。

干杯!

【问题讨论】:

  • 你不能制作一个具有 Food 和 IsSelected 属性的对象包装器 SelectableFood 吗?然后,您可以使用该包装器类型的 ObservableCollection,而不是 Food 类型的可观察集合。
  • 您是要使用复选框进行交互(读/写)还是仅演示(只读)
  • 实现 INotifyPropertyChanged 的​​通用 SelectableItem 通常会有所帮助
  • @Lithium 和 Rufo 爵士,我目前正在这样做,但列表需要显示在多个地方,每个地方都有不同的选择。我正在寻找可以让我维护一个主要项目列表的东西,然后单独列出已选择的项目。感谢您的快速回复,顺便说一句!

标签: c# wpf linq data-binding observablecollection


【解决方案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&lt;Food&gt; FoodItemsList&lt;Food&gt; SelectedFoodItems 组成。也许不是最优雅的,但应该很容易根据需要在 SelectedItem 列表之间切换。

【讨论】:

    猜你喜欢
    • 2018-05-21
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多