首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ComboBox和ReactiveUI窗体绑定到ReactiveUI

使用ComboBox和ReactiveUI窗体绑定到ReactiveUI
EN

Stack Overflow用户
提问于 2015-12-17 14:01:05
回答 5查看 2.6K关注 0票数 5

我希望使用ComboBox将视图模型中的属性绑定到Windows应用程序中的ReactiveUI。

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

编辑:第1部分:将选定的值绑定到注释中的以下示例:

代码语言:javascript
复制
this.Bind(ViewModel, vm => vm.ViewModelProperty, v => v.comboBox.SelectedValue, comboBox.Events().SelectedValueChanged);

我得到了错误:CS1955 Non-invocable member 'Component.Events' cannot be used like a method.

第2部分:将ComboBox中的项绑定到视图模型中的集合?不知道怎么做

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-12-18 22:01:01

可以使用Observable.FromEventPattern方法将SelectedIndexChanged事件的触发绑定到视图模型属性。

代码语言:javascript
复制
comboBoxWithItems.DataSource = ViewModel.ListOfPossibleItemsProperty;
comboBoxWithItems.DisplayMember = "Name";

Observable.FromEventPattern<EventHandler, EventArgs>(
    ev => comboBoxWithItems.SelectedIndexChanged += ev,
    ev => comboBoxWithItems.SelectedIndexChanged -= ev)
    .Select(x => comboBoxWithItems.SelectedItem)
    .BindTo(this, x => x.ViewModel.SelectedItemProperty);
票数 3
EN

Stack Overflow用户

发布于 2015-12-17 16:43:55

首先,视图应该实现IViewFor<YourViewModel>接口,然后再实现

代码语言:javascript
复制
this.Bind(ViewModel, vm => vm.PropertyToBind, x => comboBox.SelectedValue, comboBox.Events().SelectedValueChanged) 

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

代码语言:javascript
复制
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; }
    }
}
票数 4
EN

Stack Overflow用户

发布于 2016-08-29 06:45:02

您的初始vm.SelectedItem为空,并且还没有从视图中更新VM的任何更改。在VM构造函数中设置初始选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34336446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档