深入研究.NET数据绑定的精彩世界。我有一个文本框,其text属性我想绑定到另一个对象中的字符串数组的特定元素。 (表单包含一个组合框,用于选择元素的索引)。
换句话说,我想做这样的事情:
textBoxFictionShort.DataBindings.Add(
new Binding("Text", m_Scenario, "Fiction[int32.Parse(comboBoxSelector.Text)]"));
其中m_Scenario包含
public string[] Fiction { get; set; }
我从中获取的属性。显然上面的Binding不会检索我的项目。 AFAIK我无法创建接受参数的属性。使用数据绑定时,优雅/正确的解决方案是什么?我可以想到几个看似丑陋的变通方法(即m_Scenario中的一个字符串属性引用我正在绑定的数组字符串,以及一个更新组合框SelectedIndexChanged事件的字符串属性的公共函数。)
答案 0 :(得分:0)
这是拥有View Model的绝佳场所。 Here's another ViewModel link
我要做的是在ViewModel中有以下内容(由视图中的组件绑定)
绑定到组合框的项目源的IObservable属性,根据数组的大小添加/删除
绑定到组合框的SelectedElement的所选索引的int属性。在设置此属性时,您必须执行从string到int的转换。
一个字符串属性绑定到textbox.text(你可能在这里使用一个标签,by by)每次更改所选索引的上述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()));
}
}
}
这不是完美的,但是它应该让您知道如何创建具有可绑定属性的viewmodel。所以在你的xaml中你会有类似的东西:
<ComboBox ItemSource="{Binding AvailableIndices}" SelectedItem="{Binding SelectedIndex}"/>
<TextBox Text="{Binding TextBoxText}"/>
答案 1 :(得分:0)
我认为你在WinForms(不是WPF)中,在这种情况下你可以直接绑定到ComboBox的SelectedValue属性......
comboBox1.DataSource = m_Scenario.Fiction;
textBoxFictionShort.DataBindings.Add(new Binding("Text", comboBox1, "SelectedValue"));
答案 2 :(得分:0)
...
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");
}
}