通过底部表单中的参数过滤.NET MAUI MVVM中collectionView的数据

问题描述 投票:0回答:1

我正在过滤一个从 ObservableCollection 获取数据的 collectionView。逻辑位于 ViewModel 类中。我从 HTTP 请求获取 ObservableCollection 的数据,然后将接收到的数据分配给 Products 字段,该字段由 collectionView 访问。

public ObservableCollection<Product> Prodyct = httpClient.GetFromJsonAsync<ObservableCollection<Product>>("http://10.0.2.2:5192/api/Product").Result;


public  ObservableCollection<Product> Products
{
    get
    {
        var temp = Prodyct;

        return temp;
    }
    set          
    {
        if (Products != value)
        {
            Products = value;
            OnPropertyChanged();
        }
    }
}

我还尝试实现一个半工作(一次性)文本搜索,在此基础上我们还做了一个测试过滤:

private void OnChanged(object obj)
{
    List<Product> TempFiltered;
    
    TempFiltered = Prodyct.Where(contact => contact.Title.Contains(obj.ToString(), StringComparison.OrdinalIgnoreCase)).ToList();

    foreach (var item in Prodyct.ToList())
    {
        if (!TempFiltered.Contains(item))
        {
            Products.Remove(item);
        }
        else
        {
            if (!Products.Contains(item))
            {
                Products.Add(item);
            }
        }
    }
    OnPropertyChanged();
}

过滤实现的一个特点是,首先调用 BottomSheet,它也链接到同一个 ViewModel(在我看来,这会更方便),然后在此窗口中选择参数来过滤集合(制造商名称),单击按钮时,将调用一个命令,其工作方式与根据上面显示的文本的搜索方法相同。但是,如果搜索有效一次,但仍然有效,则过滤拒绝更新集合,尽管事实上项目已从产品中删除,但 collectionView 根本没有更新。

private void Filtration(object obj)//The object is obtained from the XAML Bottomsheet
{
    List<Product> TempFiltered;
    var searchM = obj as Manufacturer;
    TempFiltered = Prodyct.Where(c => c.manufacturer.Contains(searchM.Title, StringComparison.OrdinalIgnoreCase)).ToList();
    foreach (var item in Prodyct.ToList())
    {
        if (!TempFiltered.Contains(item))
        {
            Products.Remove(item);
        }
        else
        {
            if (!Products.Contains(item))
            {
                Products.Add(item);
            }
        }
    }
    OnPropertyChanged();
}

为了创建 BottomSheet,我使用了 https://github.com/the49ltd/The49.Maui.BottomSheet

这是我第一次使用 MVVM 模式,所以我不确定字段是否声明正确,以及搜索和过滤是否正确。如果您能告诉我如何正确修复/进行搜索和过滤,我将非常感激。 在我看来,当调用过滤命令时,ObservableCollection Products 由于某种原因不报告数据更新

c# mvvm maui
1个回答
0
投票

我会将过滤器声明为新的/派生的属性,例如

public ObservableCollection<Product> FilteredProducts
    => new ObservableCollection<Product>(Prodyct.Where(c => c.manufacturer.Contains(searchM.Title, StringComparison.OrdinalIgnoreCase)));

然后,要刷新属性,您需要做的就是调用

OnPropertyChanged(nameof(FilteredProducts))

© www.soinside.com 2019 - 2024. All rights reserved.