以编程方式在动态组合框中为WPF中的动态文本框设置数据绑定

时间:2015-10-28 16:59:15

标签: c# wpf xaml combobox textbox

此部分有效。

在我的C#.NET WPF XAML中,我有一个静态 ComboBox和一个静态 TextBox。 TextBox显示来自同一DataTable的另一列(在ComboBox的ItemSource中)。 “rr_code”列是公司名称的列,“rr_addr”列是地址的列。

<ComboBox x:Name="CompanyComboBox1" IsEditable="True" IsTextSearchEnabled="True" IsSynchronizedWithCurrentItem="False"/>
<TextBox x:Name="StreetTextBox1" DataContext="{Binding SelectedItem, ElementName=CompanyComboBox1}" Text="{Binding rr_addr}" IsManipulationEnabled="True"\>

ComboBox以编程方式从DataTable中的列读取:

 CompanyComboBox1.ItemsSource = Rails.DefaultView; // Rails is a DataTable
 CompanyComboBox1.DisplayMemberPath = "rr_code"; // column name for company name

此部分不起作用

问题是,我现在有了一个“添加公司”按钮,可以在StackPanel中创建一个新表单,动态并具有这个确切的功能。 ComboBox完全按预期工作。这是我到目前为止所做的:

ComboBox companyComboBox = new ComboBox();
companyComboBox.ItemsSource = Rails.DefaultView;
companyComboBox.IsEditable = true;
companyComboBox.IsTextSearchEnabled = true;
companyComboBox.DisplayMemberPath = "rr_code";

问题出现在TextBox中,当我更改动态的companyComboBox时没有更新,所以我确定它与绑定有关。

TextBox streetTextBox = new TextBox();
streetTextBox.DataContext = companyComboBox;
Binding b = new Binding("rr_addr");
b.Mode = BindingMode.Default;
b.Source = companyComboBox.SelectedItem;
streetTextBox.SetBinding(ComboBox.SelectedItemProperty, b);

为TextBox streetTextBox设置绑定的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

纯C#中此特定XAML + C#数据绑定的代码隐藏等同于:

ComboBox companyComboBox = new ComboBox();
companyComboBox.ItemsSource = Rails.DefaultView;  // Rails being DataTable
companyComboBox.IsEditable = true;
companyComboBox.IsTextSearchEnabled = true;
companyComboBox.DisplayMemberPath = "rr_code";

Binding b = new Binding("SelectedItem.rr_addr");  // The selected item's 'rr_addr' column ...
b.Source = companyComboBox;                       // ... of the companyComboBox ...

TextBox streetTextBox = new TextBox();    
streetTextBox.SetBinding(TextBox.TextProperty,b); // ... is bound to streetTextBox's Text property.

错误发生在最后一行。 SetBinding需要具有目标的属性,而不是源。此外,Binding声明需要&#34; SelectedItem。&#34;出于某种原因。

答案 1 :(得分:2)

为什么要设置TextBox DataContext?

您可以简单地将TextBox.Text属性绑定到XAML中的ComboBox SelectedItem

<TextBox Text="{Binding ElementName=CompanyComboBox1, Path=SelectedItem.rr_addr}"></TextBox>