我正在尝试学习反应性。我一直在存储库中的WPF示例项目https://github.com/reactiveui/reactiveui/tree/tree/master/samples/getting-started
我决定尝试将其转换为Winforms,但有问题。
在WPF示例中,搜索函数通过oaph填充了" Main" ViewModel(AppViewModel)的属性,称为searchResults,它是" child''''''ViewModels(NugetDetailsviewModel)的IEnumeraults
public IEnumerable<NugetDetailsViewModel> SearchResults => _searchResults.Value;
在" Main"视图(MainWindow)中,有一个列表框,其itempt oft boct of toceults键入了搜索量,即viewmodels的iEnumerable。似乎正在进行一些巫术,可以找到并显示给定ViewModel的适当视图。它甚至在评论中说:
在我们的MainWindow中,当我们在列表框中注册NugetDetailsviewModels的列表框时,如果未声明ItemTemplate,它将搜索从IViewFor中派生的类,并显示该项目。
>
在winforms i think 我有两个问题,但我可能会出现一个..或更多:
- 似乎并不是找到ViewModel的视图的巫术,但这可能是由于问题二。
- 如何将ViewModels的Ienumerable绑定到Winforms控件?
在Winforms中,我正在使用flowlayoutpanel代替列表框,并尝试了几种变体:
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;
} ));
为清楚起见,与我的"孩子" ViewModel链接的"孩子"视图也源自ReactiveUserControl。
我使用以下代码注册视图:
Locator.CurrentMutable.RegisterViewsForViewModels(Assembly.GetCallingAssembly());
并检查了它们是否已注册。
如果有人能够提供帮助。
作为附录,如果有人知道使用ReactiveUI知道一些更复杂的示例项目,尤其是使用Winforms,这将非常有帮助。
谢谢。
在reactiveui 9.11中有一个新功能,它允许您绑定到具有Control.ControlCollection
或TableLayoutControlCollection
这将使您可以自动添加到控件中。
这是由称为ISetMethodBindingConverter
的新界面提供的,该界面使您可以覆盖我们绑定引擎中的"集合"的工作方式。
现在有一个用于Winforms申请的示例:https://github.com/reactiveui/reactiveui.samples/tree/master/master/winforms/reactivedemo