数据绑定文本框.文本转换为字符串数组的特定元素
本文关键字:文本 元素 数组 字符串 转换 数据绑定 | 更新日期: 2023-09-27 18:07:49
深入研究。net数据绑定的奇妙世界。我有一个文本框,我想将其文本属性绑定到另一个对象中字符串数组的特定元素。(表单包含一个选择元素索引的组合框)。
换句话说,我想做这样的事情:
textBoxFictionShort.DataBindings.Add(
new Binding("Text", m_Scenario, "Fiction[int32.Parse(comboBoxSelector.Text)]"));
其中m_Scenario包含
public string[] Fiction { get; set; }
属性。显然,上面的Binding不会检索我的项目。我不能创建接受参数的属性。在使用数据绑定时,优雅/正确的解决方案是什么?我可以想到几个看似丑陋的解决方案(即m_Scenario中的字符串属性引用了我绑定到的数组字符串,以及一个公共函数更新了combobox SelectedIndexChanged事件的字符串属性)。
这是放置视图模型的绝佳位置。这是另一个ViewModel链接
我要做的是在ViewModel中(由视图上的组件绑定)
一个绑定到组合框的项目源的IObservable属性,你可以根据数组
的大小来添加/移除它。一个int属性,用于绑定到组合框的selecteelement的选定索引。当设置此属性时,必须执行从string到int的转换。
绑定到文本框的字符串属性。文本(顺便说一下,您可能在这里使用标签),每次更改所选索引的上述int属性时,都会更新该文本。
如果这让你感到困惑,我可以构建一些伪代码,但这三个属性应该可以工作并得到你想要的。
编辑-添加一些代码:
public class YourViewModel : DependencyObject {
public string[] FictionArray {get; private set;}
public IObservable<string> AvailableIndices;
public static readonly DependencyProperty SelectedIndexProperty=
DependencyProperty.Register("SelectedIndex", typeof(string), typeof(YourViewModel), new PropertyMetadata((s,e) => {
var viewModel = (YourViewModel) s;
var index = Convert.ToInt32(e.NewValue);
if (index >= 0 && index < viewModel.FictionArray.Length)
viewModel.TextBoxText=FictionArray[index];
}));
public bool SelectedIndex {
get { return (bool)GetValue(SelectedIndexProperty); }
set { SetValue(SelectedIndexProperty, value); }
}
public static readonly DependencyProperty TextBoxTextProperty=
DependencyProperty.Register("TextBoxText", typeof(string), typeof(YourViewModel));
public bool TextBoxText {
get { return (bool)GetValue(TextBoxTextProperty); }
set { SetValue(TextBoxTextProperty, value); }
}
public YourViewModel(string[] fictionArray) {
FictionArray = fictionArray;
for (int i = 0; i < FictionArray.Length; i++){
AvailableIndices.Add(i.ToString()));
}
}
}
这不是完美的,但它应该给你一些想法,你可以如何创建一个视图模型的属性,你可以绑定。在你的xaml中你可以这样写:
<ComboBox ItemSource="{Binding AvailableIndices}" SelectedItem="{Binding SelectedIndex}"/>
<TextBox Text="{Binding TextBoxText}"/>
我想你是在WinForms(不是WPF),在这种情况下,你可以直接绑定到ComboBox的SelectedValue属性…
comboBox1.DataSource = m_Scenario.Fiction;
textBoxFictionShort.DataBindings.Add(new Binding("Text", comboBox1, "SelectedValue"));
Add BindingSource
...
bindingSource1.DataSource = m_Scenario.Fiction
.Select((x, i) => new {Key = i + 1, Value = x})
.ToDictionary(x => x.Key, x => x.Value);
comboBox1.DisplayMember = "Key";
comboBox1.DataSource = bindingSource1;
textBox1.DataBindings.Add("Text", bindingSource1, "Value");
}
}