【问题标题】:Binding a Filtered ObservableCollection to a ListView while keeping Two-Way binding?在保持双向绑定的同时将过滤后的 ObservableCollection 绑定到 ListView?
【发布时间】:2015-11-08 09:04:36
【问题描述】:

绑定到 ListViewObservableCollection 是否有可能返回 仅经过过滤的 Items 子集,同时保留 双向绑定?那么当我添加/删除项目时,更改会反映到 UI 上吗?

基本上,我有一个 AllItems ObservableCollection 和绑定在第二个 ListView 级别的 FilteredItems ObservableCollection。添加/删除项目时,AllItems 是已更改的项目,但 FilteredItems 引用它并根据特定过滤器获取项目子集。

我有 2 个嵌套的 ListView。它看起来像这样:

<ListView ItemsSource="{Binding Path=Seats}"
      SelectedItem="{Binding Path=SelectedSeat, Mode=TwoWay}">
<ListView.ItemTemplate>
    <DataTemplate>
            <ListView x:Name="ListView_CheckItems" IsSwipeEnabled="False"
                  ItemsSource="{Binding Path=CheckItemsSeatsDisplayCollection}"
                  SelectedItem="{Binding Path=SelectedCheckItem,
                                         Mode=TwoWay}"
                  SelectionMode="Single"
                  Grid.Column="1">
            </ListView>
    </DataTemplate>
</ListView.ItemTemplate>
<ListView.ItemsPanel>
    <ItemsPanelTemplate>
        <WrapGrid Orientation="Horizontal" MaximumRowsOrColumns="1" ></WrapGrid>
    </ItemsPanelTemplate>
</ListView.ItemsPanel>

我的主视图模型如下所示:

public class ParentViewModel
{
private ObservableCollection<SeatsViewModel> _Seats = null;
public ObservableCollection<SeatsViewModel> Seats
{
    get
    {
        return _Seats;
    }
    set
    {
        _Seats = value;
    }
}

private ObservableCollection<CheckItemsViewModel> _AllCheckItems = null;
public ObservableCollection<CheckItemsViewModel> AllCheckItems
{
    get
    {
        return _AllCheckItems;
    }
    set
    {
        _AllCheckItems = value;
    }
}
}

我的 SeatsViewModel 看起来像这样:

public class SeatsViewModel
{
public int SeatNumber {get;set;}

public ObservableCollection<CheckItemsViewModel> _CheckItemsSeatsDisplayCollection
{
    get
    {
        //I want to return only a subset of the items in AllCheckItems
        //return ParentViewModel.Instance.AllCheckItems.Where(c => c.SeatNumber.Equals(SeatNumber));
    }
}
}

我无法执行 LINQ 查询并返回它,因为它返回 IEnumerable 并且在绑定时不会跟踪更改。

我做错了什么/有没有其他方法可以实现我想要实现的目标?

谢谢!

【问题讨论】:

    标签: c# listview filter windows-store-apps


    【解决方案1】:

    您可以使用 CollectionViewSource 来做您想做的事。这是一种过滤方式。看看MSDN article on CollectionViewSource

    如果您需要更大的灵活性,您还可以使用Code Project 上提供的解决方案。

    更新

    您还可以注册 CollectionChanged 事件,并在处理程序中将其添加或删除到原始 Collection。更改项目应以这种方式单独处理。 在这些情况下,我通常有一个属性将 Linq 查询的结果作为 IEnumerable 返回。然后总是在原始对象中进行更改。当然,您需要自己进行 Collection-changes。但是,如果这是通过按钮完成的,那也很容易。然后我在原始集合上有一个 CollectionChanged 处理程序来触发过滤属性的 OnPropertyChanged。

    希望这会有所帮助。绑定不能解决所有场景的:)

    马丁

    【讨论】:

    • 谢谢马丁。我之前尝试过该路径,不幸的是,绑定消失了(例如,如果我向集合中添加一个项目,它不会反映在 UI 上。我不得不再次绑定它)。我最终做的是为每个 ListViewItem 附加一个行为,并根据 Visual Tree 中的父级将 Visibility 动态更改为 Visible 或 Collapsed。
    猜你喜欢
    • 2011-08-27
    • 2020-12-04
    • 2012-05-26
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    相关资源
    最近更新 更多