我正在过滤一个从 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 由于某种原因不报告数据更新
我会将过滤器声明为新的/派生的属性,例如
public ObservableCollection<Product> FilteredProducts
=> new ObservableCollection<Product>(Prodyct.Where(c => c.manufacturer.Contains(searchM.Title, StringComparison.OrdinalIgnoreCase)));
然后,要刷新属性,您需要做的就是调用
OnPropertyChanged(nameof(FilteredProducts))
。