【问题标题】:Programmatically Set Data Binding in WPF for Dynamic TextBoxes from a Dynamic ComboBox以编程方式在 WPF 中为来自动态组合框的动态文本框设置数据绑定
【发布时间】:2015-10-28 16:59:14
【问题描述】:

这部分有效。

在我的 C#.NET WPF XAML 中,我有一个 static 组合框和一个 static 文本框。 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 设置绑定的正确方法是什么?

【问题讨论】:

    标签: c# wpf xaml combobox textbox


    【解决方案1】:

    纯 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 声明需要“SelectedItem”。出于某种原因。

    【讨论】:

      【解决方案2】:

      你为什么要设置 TextBox DataContext ?

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

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

      【讨论】:

      • 哦,我认为 DataContext 很重要,但这确实有助于清理代码。看来我现在在您的“Path=SelectedItem.rr_addr”的帮助下回答了我自己的问题。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-25
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多