DataBinding Textbox.Text для определенного элемента массива строк - PullRequest
1 голос
/ 07 сентября 2011

Окунитесь в удивительный мир привязки данных .NET.У меня есть текстовое поле, свойство текста которого я хочу привязать к определенному элементу массива строк в другом объекте.(Форма содержит поле со списком, который выбирает индекс элемента).

Другими словами, я хотел бы сделать что-то вроде этого:

textBoxFictionShort.DataBindings.Add(
                new Binding("Text", m_Scenario, "Fiction[int32.Parse(comboBoxSelector.Text)]"));

, где m_Scenario содержит свойство

public string[] Fiction { get; set; }

, из которого я получаю источник.Очевидно, что Привязка выше не получит мой предмет.AFAIK Я не могу создать свойства, которые принимают параметры.Каково элегантное / правильное решение для этого при использовании привязки данных?Я могу вспомнить несколько уродливых обходных путей (то есть свойство строки в m_Scenario, которое ссылается на строку массива, к которой я привязываюсь, и публичную функцию, которая обновляет свойство строки в событии combobox SelectedIndexChanged).

Ответы [ 3 ]

0 голосов
/ 08 сентября 2011

Я думаю, что вы находитесь в WinForms (не WPF), в этом случае вы можете просто привязать непосредственно к свойству ComboBox SelectedValue ...

comboBox1.DataSource = m_Scenario.Fiction;
textBoxFictionShort.DataBindings.Add(new Binding("Text", comboBox1, "SelectedValue"));
0 голосов
/ 08 сентября 2011

Добавить 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");
      }
}
0 голосов
/ 07 сентября 2011

Это отличное место, чтобы иметь модель . Вот еще одна ссылка ViewModel

То, что я хотел бы сделать, это иметь следующее в ViewModel (которая связана с компонентами в представлении)

свойство IObservable, привязанное кисточник элементов поля со списком, который вы добавляете / удаляете в зависимости от размера массива

свойство int для выбранного индекса, связанного с SelectedElement поля со списком.Вам нужно будет выполнить преобразование из строки в int, когда это свойство устанавливается.

строковое свойство, которое связано с textbox.text (вы, вероятно, можете использовать метку здесь, 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()));
        }
    }
}

Это не идеально, но оно должно дать вам некоторое представление о том, как вы можете создать модель представления со свойствами, с которыми вы могли бы связываться.Так что в вашем xaml у вас будет что-то вроде:

<ComboBox ItemSource="{Binding AvailableIndices}" SelectedItem="{Binding SelectedIndex}"/>

<TextBox Text="{Binding TextBoxText}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...