Как привязать пользовательские элементы управления с помощью ReactiveUI и winforms - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь выучить ReactiveUI.Я смотрел пример проекта wpf в репозитории https://github.com/reactiveui/ReactiveUI/tree/master/samples/getting-started

Я решил попробовать преобразовать это в winforms, но у меня есть проблема.

В примере wpf заполняется функция поиска,через OAPH, свойство 'Main' ViewModel (AppViewModel), называемое SearchResults, которое является IEnumerable из 'Child' ViewModels (NuGetDetailsViewModel)

public IEnumerable<NugetDetailsViewModel> SearchResults => _searchResults.Value;

в «Main» View (MainWindow) есть списоккоторый имеет свой ItemSource, связанный с SearchResults, т.е. IEnumerable из ViewModels.Кажется, что происходит некоторое волшебство, которое находит и отображает соответствующий View для данной ViewModel.В комментариях даже говорится:

В нашем MainWindow, когда мы регистрируем ListBox с коллекцией NugetDetailsViewModels, если ItemTemplate не был объявлен, он будет искать класс, производный от IViewFor, и покажет, что дляitem.


В winforms я думаю У меня две проблемы, но я могу выйти на одну .. или больше:

  1. Этоне похоже, что работает тот же самый мастер по нахождению View для ViewModel, но это может быть связано с проблемой 2.
  2. Как я могу привязать IEnumerable of ViewModels к элементу управления winforms?

    В winforms я использую flowlayoutpanel вместо ListBox и пробовал несколько вариантов:

    this.OneWayBind(ViewModel, vm => vm.ResultsList, v => v.flowLayoutPanel1.DataBindings)
    

    Я смог использовать некоторый код преобразования непосредственно в View для обновлениянепосредственно в flowLayoutPanel, но он требует непосредственного знания дочернего представления и не подходит мне, и не так автоматичен, как хотелось бы.

    this.OneWayBind(ViewModel, 
                vm => vm.ResultsList,
                v  => v.flowLayoutPanel1, 
                selector: value => 
                {
                    this.flowLayoutPanel1.Controls.Clear();
                    foreach (var value in values)
                    {
                        this.flowLayoutPanel1.Controls.Add(new AssemblyInfoView() { ViewModel = value });
                    }
                    return this.flowLayoutPanel1;
                } ));
    

    Для ясности «дочерний» вид, связанный с моей «дочерней» моделью представления, также происходит от ReactiveUserControl.

    Я использую следующий код для регистрации представлений:

    Locator.CurrentMutable.RegisterViewsForViewModels(Assembly.GetCallingAssembly());
    

    и проверил, что они зарегистрированы.


    Если кто-то сможет помочь, этоПримите во внимание.

    В качестве дополнения, если кто-нибудь знает о некоторых более сложных примерах проектов, использующих ReactiveUI, особенно с использованием winforms, которые были бы очень полезны.

    Спасибо.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

В ReactiveUI 9.11 есть новая функция, которая позволяет связывать любой элемент управления с Control.ControlCollection или TableLayoutControlCollection

. Это позволит вам иметь егоавтоматически добавлять к элементам управления.

Это стало доступно благодаря новому интерфейсу под названием ISetMethodBindingConverter, который позволяет вам переопределить работу 'Set' в нашем механизме связывания.

Теперь естьобразец для приложения WinForms находится здесь: https://github.com/reactiveui/ReactiveUI.Samples/tree/master/winforms/ReactiveDemo

0 голосов
/ 20 февраля 2019
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...