【问题标题】:How to bind to user controls using ReactiveUI and winforms如何使用 ReactiveUI 和 winforms 绑定到用户控件
【发布时间】:2019-02-20 16:39:04
【问题描述】:

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

我决定尝试将其转换为 winform,但遇到了问题。

在 wpf 示例中,搜索功能通过 OAPH 填充名为 SearchResults 的“主”视图模型 (AppViewModel) 的属性,该属性是“子”视图模型 (NuGetDetailsViewModel) 的 IEnumerable

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

在“主”视图 (MainWindow) 中有一个列表框,它的 ItemSource 绑定到 SearchResults,即 ViewModel 的 IEnumerable。 似乎有一些魔法正在为给定的 ViewModel 找到并显示适当的 View。它甚至在 cmets 中这样说:

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


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

  1. 似乎与为 ViewModel 查找视图的魔法不同,但这可能是由于问题二。
  2. 如何将 ViewModel 的 IEnumerable 绑定到 winforms 控件?

在 winforms 中,我使用 flowlayoutpanel 代替 ListBox,并尝试了以下几种变体:

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

我已经能够直接在视图中使用一些转换代码来直接更新 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 的更复杂的示例项目,特别是使用 Winform 会非常有帮助,作为附录。

谢谢。

【问题讨论】:

  • 我很快就会在 ReactiveUI.Winforms 库中添加一个演示和一些实用程序。

标签: winforms binding system.reactive reactiveui


【解决方案1】:

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

这将允许您将其自动添加到控件中。

这是由一个名为ISetMethodBindingConverter 的新接口提供的,它允许您覆盖我们绑定引擎中“Set”的工作方式。

现在可以在此处找到 WinForms 应用程序的示例:https://github.com/reactiveui/ReactiveUI.Samples/tree/master/winforms/ReactiveDemo

【讨论】:

  • 格伦你是明星!这个例子非常好。我确实有一些后续问题:ISetMethodBindingConverter,我需要了解它吗?从 ViewModel 获取视图,通常我应该将 ViewModel 传递给 ViewModelControlHost 还是应该使用 ViewLocator,ViewModelControlHost 是否会做一些我缺少的事情?谢谢
  • ViewModelControlHost 有一个名为“ViewModel”的属性,当设置此属性时,它将搜索继承 IViewFor 的 Control——然后将其设为子项。如果您在 Program.cs 中注意到我注册了视图,并且 NugetDetailsView 派生自该接口。
  • 此链接已失效。
  • @GlennWatson 请修复示例链接,谢谢
【解决方案2】:

【讨论】:

  • 是的,这是我一直在使用的示例项目。请参阅我的问题开头的链接。
猜你喜欢
  • 1970-01-01
  • 2014-09-05
  • 2016-09-23
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
相关资源
最近更新 更多