1

我有 aXAML和 aMVVM显示 aDataGridObservableCollection. 所有工作正常(我以前的更多细节,已经由我自己回答,问题)。

现在我正在尝试添加一个过滤器,我想关注@mark-heath tutorial

我的项目构建引发以下

error CS0246: The type or namespace name 'ICollectionView' could not be found (are you missing a using directive or an assembly reference?) 

即使我确实包含了记录在案的命名空间

using System.ComponentModel;

而是显示哪个 Studio Code Unnecessary using directive。我的 .csproj 在 .NET Core 3.0 上

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>

该问题似乎与我如何添加程序集引用有关。

dotnet add package WindowsBase

它使用 .NET Framework 恢复包,但可能这是错误的,因为我在 .NET Core 和Linux上。

哪个是正确的方法?除了“你不能那样做”的答案......也许还有另一个等效的包要添加......来自Avalonia UI?有谁知道或用过吗?

在 Avalonia UI github 上搜索并在 gitter 上询问

我看到有一个已经关闭的github 问题,所以现在可能有解决方案吗?(我也在询问 Avalonia UI gitter 频道

4

1 回答 1

0

首先 - 即使在 WPF 和 Windows 上 - 根据我的评论,本教程是错误的:

您需要绑定到ICollectionView而不是 绑定才能ObservableCollection看到过滤效果。

所以,视图必须固定如下

<DataGrid Items="{Binding PeopleView}" 

现在,回到 Linux 和 Avalonia UI 中的问题。

正如Steven Kirk所建议的那样,我查看了 avalonia 中的 github DevTools 源代码,它在视图模型中进行了过滤,并且这条线索可以解决问题。

所以我PeopleView在视图模型中声明

public DataGridCollectionView PeopleView { get; }

作为DataGridCollectionView包含在所需命名空间中的

using Avalonia.Collections;

我终于可以实现过滤器了

public MainWindowViewModel()
{
    People = new ObservableCollection<Person>(GenerateMockPeopleTable());
    PeopleView = new DataGridCollectionView(People);
    PeopleView.Filter = o => String.IsNullOrEmpty(Filter) ? true : ((Person)o).FirstName.Contains(Filter); 

}
于 2020-04-27T16:37:13.077 回答