使用可变键将文本框绑定到字典

时间:2018-08-22 16:59:23

标签: c# winforms mvvm reactiveui

我想实现一个动态UI,在该UI中将动态创建TextBox控件,并将其内容绑定到ViewModel上的Dictionary。

我正在尝试使用ReactiveUI实现双向数据绑定。

我面临的问题是,仅当我使用文字字符串作为键时,才允许我将TextBoxes绑定到Dictionary中的条目,但是当我尝试使用字符串变量进行设置时,绑定时,出现以下错误:

Index expressions are only supported with constants.

这是我正在尝试做的非常简化的示例。 TextBox不会动态实例化以解决问题:

string PropNum = "22017";
this.Bind(ViewModel, vm => vm.ExcelData[PropNum], view => view.tbCreate.Text);

在此示例中,ExcelData是在ViewModel上定义的Dictionary<string, object>

另一方面,以下工作正常:

this.Bind(ViewModel, vm => vm.ExcelData["22017"], view => view.tbCreate.Text);

我需要查找键是一个变量。有什么方法可以达到这个结果?

谢谢

1 个答案:

答案 0 :(得分:0)

不,您无法使用Bind()做您想做的事

我们使用Expression>来确定绑定的来源。如错误消息所述,如果要使用索引,则必须使用常量。

为了让您了解Expression的功能,Expression允许您使用有关用户提供的lambda的详细信息。

this.Bind(this.ViewModel, vm => vm.Property1.Property2.Property3)

借助Expressions,您将获得有关每个属性/对象的详细信息。

我们要做的是沿途的PropertyChanged事件订阅每个对象(如果对象不为null),我们还将为其他属性适当地设置值。

表达式具有一定的局限性,因为它主要是编译时功能。

就您要实现的目标而言,您必须在获得动态价值之后做所有事情。因此,您可以在解决ExcelData索引后订阅PropertyChange事件。

您可能会在已解析的对象上使用WhenAnyValue(),

myViewModel.ExcelData[propertyIndex].WhenAnyValue(x => x.Value).BindTo(this.ViewModel, view => view.TextBox.Text);
this.WhenAnyValue(view => view.TextBox.Text).BindTo(myViewModel.ExcelData[propertyIndex], x => x.Value);

您需要两个BindTo,因为它是OneWayOnly,并且我假设您在ExcelData对象上具有Value属性。

请注意,还必须从 INotifyPropertyChanged

派生propertyIndex中包含的ExcelData对象。