Не удалось найти ICollectionView из Studio Code. NET Core - PullRequest
1 голос
/ 27 апреля 2020

У меня есть XAML и MVVM, показывающие DataGrid с ObservableCollection. Все работает и все в порядке (более подробно в моем предыдущем, уже отвечал сам, вопрос ).

Теперь я пытаюсь добавить фильтр, и я хотел бы следовать @ mark-heath учебник .

При сборке моего проекта выдается следующее

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 отображается 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 ? Кто-нибудь знает или использует это?

Поиск в gitub UI Avalonia и вопрос о gitter

Я вижу, что уже была закрыта проблема github об этом, так что, возможно, есть решение сейчас? (Я спрашиваю на интерфейсе Avalonia UI Gitter Channel тоже)

1 Ответ

0 голосов
/ 27 апреля 2020

Прежде всего - даже в WPF и Windows - учебное пособие неверно согласно моему комментарию там:

вам необходимо привязать к ICollectionView а не до ObservableCollection, чтобы увидеть эффект фильтрации.

Итак, представление должно быть исправлено следующим образом

<DataGrid Items="{Binding PeopleView}" 

Теперь вернемся к вопросу о Linux и в Avalonia UI.

Как подсказывает Стивен Кирк , я посмотрел на github DevTools source в avalonia, который выполняет фильтрацию в модели представления, и это ключ к разгадке.

Так что я объявляю 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); 

}
...