2011-09-07 40 views
1

深入到.NET數據綁定的美妙世界。我有一個文本框的文本屬性,我想綁定到另一個對象中的字符串數組的特定元素。 (該表單包含一個選擇元素索引的組合框)。DataBinding TextBox.Text到字符串數組的特定元素

換句話說,我希望做這樣的事情:

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

其中m_Scenario包含

public string[] Fiction { get; set; } 

屬性,我從源代碼。顯然上面的綁定不會檢索我的物品。 AFAIK我無法創建接受參數的屬性。使用數據綁定時,這個優雅/正確的解決方案是什麼?我可以想到幾個看起來醜陋的解決方法(即m_Scenario中的一個字符串屬性,它引用了我綁定的數組字符串,以及一個更新組合框SelectedIndexChanged事件的字符串屬性的公共函數)。

+0

道歉仍沒有標明這個問題的回答。我陷入了一個完全不同的局面,但會回到這個問題上,並根據我最終使用的內容來標記它。 – Drakestar

回答

0

這是一個很好的地方有一個View ModelHere's another ViewModel link

我會做的就是在視圖模型(即得到由部件上的觀點勢必會)

綁定到該組合框的項目源的的IObservable屬性,您添加/刪除以下取決於數組的大小

所選索引綁定到組合框的SelectedElement的int屬性。當設置此屬性時,您將不得不從字符串轉換爲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}"/> 
+0

從重讀我意識到我可能誤解了你所說的話。我以爲你想要一個組合框,其中有像(o,1,...,n-1)這樣的條目,用於名爲FicionArray的數組索引。如果您希望組合框將實際的字符串包含在數組中,可以通過將TextBox綁定到SelectedItemProperty並進行更改,以便它不執行任何幻想轉換或設置TextBoxText。(實際上,完全刪除TextBoxText&TextBoxTextProperty。) – Kevek

0

我認爲你是在的WinForms(不WPF),在這種情況下,你可以只直接綁定到ComboBox的SelectedValue屬性...

comboBox1.DataSource = m_Scenario.Fiction; 
textBoxFictionShort.DataBindings.Add(new Binding("Text", comboBox1, "SelectedValue")); 
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"); 
     } 
}