如何使用ReactiveUI和winforms绑定到用户控件

问题描述 投票:2回答:2

我正在尝试学习ReactiveUI。我一直在查看存储库https://github.com/reactiveui/ReactiveUI/tree/master/samples/getting-started中的wpf示例项目

我决定尝试将其转换为winforms,但有问题。

在wpf示例中,搜索函数通过OAPH填充名为SearchResults的“Main”ViewModel(AppViewModel)的属性,该属性是“Child”ViewModels(NuGetDetailsViewModel)的IEnumerable

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

在'Main'视图(MainWindow)中有一个列表框,它的ItemSource绑定到SearchResults,即IEnumerable的ViewModels。似乎有一些巫术正在发现并显示给定ViewModel的相应视图。它甚至在评论中这样说:

在我们的MainWindow中,当我们使用NugetDetailsViewModels的集合注册ListBox时,如果没有声明ItemTemplate,它将搜索从IViewFor派生的类并显示该项目。


在winforms中我认为我有两个问题,但我可能只有一个...或更多:

  1. 看起来查找ViewModel的视图的工作似乎并不相同,但这可能是由于问题二。
  2. 如何将IEnumerable的ViewModel绑定到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;
            } ));

为清楚起见,链接到我的'Child'ViewModel的'Child'视图也来自ReactiveUserControl。

我使用以下代码注册视图:

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

并检查他们是否已注册。


如果有人能够提供帮助,那将是值得赞赏的。

作为附录,如果有人知道使用ReactiveUI的一些更复杂的示例项目,特别是使用非常有用的winforms。

谢谢。

winforms binding system.reactive reactiveui
2个回答
0
投票

ReactiveUI 9.11中有一个新功能,允许您绑定任何具有Control.ControlCollectionTableLayoutControlCollection的控件

这将允许您将其自动添加到Control的。

这是通过一个名为ISetMethodBindingConverter的新界面提供的,它允许您覆盖绑定引擎中“Set”的工作方式。

现在有一个WinForms应用程序的示例:https://github.com/reactiveui/ReactiveUI.Samples/tree/master/winforms/ReactiveDemo


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