winforms - 使用 ReactiveUI 和 Windows 窗体绑定(bind)到 ComboBox

标签 winforms mvvm binding reactiveui

我想使用 ReactiveUI 将 View 模型中的属性绑定(bind)到 Windows 窗体应用程序中的 ComboBox。

我找到了几个使用 WPF 的示例,但没有找到使用 Windows 窗体的示例。

编辑: 第 1 部分:将所选值绑定(bind)到 以下来自评论的示例:

this.Bind(ViewModel, vm => vm.ViewModelProperty, v => v.comboBox.SelectedValue, comboBox.Events().SelectedValueChanged);

我收到错误:CS1955 不可调用成员“Component.Events”不能像方法一样使用。

第 2 部分:将 ComboBox 中的项目绑定(bind)到 View 模型中的集合 ?不知道怎么办

最佳答案

首先,您的 View 应该实现 IViewFor<YourViewModel>界面然后

this.Bind(ViewModel, vm => vm.PropertyToBind, x => comboBox.SelectedValue, comboBox.Events().SelectedValueChanged) 

编辑: 我创建了一个演示项目:

using System;
using System.Reactive.Linq;
using System.Windows.Forms;
using ReactiveUI;

namespace WindowsFormsApplication
{
    public partial class Form1 : Form, IViewFor<MyViewModel>
    {
        public Form1()
        {
            InitializeComponent();

            ViewModel = new MyViewModel();
            comboBox1.DataSource = ViewModel.Items;

            var selectionChanged = Observable.FromEvent<EventHandler, EventArgs>(
                h => (_, e) => h(e),
                ev => comboBox1.SelectedIndexChanged += ev,
                ev => comboBox1.SelectedIndexChanged += ev);
            this.Bind(ViewModel, vm => vm.SelectedItem, x => x.comboBox1.SelectedItem, selectionChanged);
        }

        public MyViewModel ViewModel { get; set; }

        object IViewFor.ViewModel
        {
            get { return ViewModel; }
            set { ViewModel = (MyViewModel)value; }
        }
    }

    public class MyItem
    {
        private readonly string _text;

        public MyItem(string text)
        {
            _text = text;
        }

        public override string ToString()
        {
            return _text;
        }
    }

    public class MyViewModel : ReactiveObject
    {
        private MyItem _selectedItem;

        public MyViewModel()
        {
            Items = new ReactiveList<MyItem> {new MyItem("test1"), new MyItem("test2")};
        }

        public MyItem SelectedItem
        {
            get { return _selectedItem; }
            set { this.RaiseAndSetIfChanged(ref _selectedItem, value); }
        }

        public ReactiveList<MyItem> Items { get; private set; }
    }
}

关于winforms - 使用 ReactiveUI 和 Windows 窗体绑定(bind)到 ComboBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34336446/

相关文章:

c# - 使用 WinForms DevExpress XtraGrid c# 显示层次结构树

c# - 处理用户控件 (MVVM) 中的输入手势

c# - 为什么列表框模板中的绑定(bind)命令无法运行?

objective-c - 不使用 NSMatrix 的 Cocoa 单选按钮可以绑定(bind)吗?

syntax - Unusual Scheme `let`绑定(bind),什么是 `f`?

wpf - ProgressBar 不更新通过绑定(bind)更改为 Maximum

winforms - 从映射的驱动器或共享文件夹运行 .NET 程序 - 优点/缺点

winforms - View&Presenter应该在哪里出生

C# 如何像组合框一样制作列表框下拉列表?

wpf - 在 ItemsControl 中绑定(bind)到 Item 的 DataContext