数据绑定文本框.文本转换为字符串数组的特定元素

本文关键字:文本 元素 数组 字符串 转换 数据绑定 | 更新日期: 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");
      }
}