DataBinding Textbox.Text到字符串数组的特定元素

时间:2011-09-07 18:42:43

标签: c# winforms arrays data-binding textbox

深入研究.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事件的字符串属性的公共函数。)

3 个答案:

答案 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)

添加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");
      }
}