为什么绑定文本框不修改其关联属性是文本值是以编程方式设置的?

时间:2015-10-29 18:30:37

标签: c# winforms data-binding textbox entity-framework-6

我有一个带有许多文本框的Windows窗体。我将它们绑定到DataSource作为Form Loads。

public partial class FormSettings : Form
{
    private readonly DbContext _context = new DbContext();

    public FormSettings()
    {
        InitializeComponent();
    }

    protected override void OnLoad(EventArgs e)
    {
        _context.OrderEntrySettings.Load();

        SettingsBindingSource.DataSource = _context.OrderEntrySettings.Local.ToBindingList();

        Binding saNbinding = new Binding("Text", SettingsBindingSource, "InvoiceNumber");

        InvoiceNumberTextBox.DataBindings.Add(saNbinding);

        Binding pthNbinding = new Binding("Text", SettingsBindingSource, "SalesOrderExportPath");

        PathTextBox.DataBindings.Add(pthNbinding);

    <snip>
    …   
    </snip>
}

其中一个文本框绑定到目录路径(字符串)属性。 如果我在路径文本框中键入一个新目录并点击我的保存按钮,路径保存就好了。

但是,如果我从FolderBrowserDialog对话框中将文本框上的文本属性更改为SelectedPath然后点击保存,则文本框文本显示我选择的目录,但实体未被修改,并且没有任何内容被保存回数据库。 / p>

作为一种解决方法,我设置了Path Textbox Text并将Property从上下文设置为SelectedPath。

如果以编程方式设置Text值,为什么Bound Textbox不会修改其关联属性?

提前致谢,

2 个答案:

答案 0 :(得分:5)

原因如下。 Binding类有一个名为DataSourceUpdateMode的属性,有3个选项 - NeverOnPropertyChangedOnValidation最后是默认值。以编程方式设置Text属性时,没有验证/验证事件,因为它们仅在控件处于焦点且已编辑时触发,因此绑定不会更新数据源。

话虽如此,以下是您的选择:

(A)不要以编程方式设置控件属性,而是设置数据源属性。

(B)将绑定DataSourceUpdateMode更改为OnPropertyChanged。但是,这将导致在用户键入的每个char上更新数据源属性。

(C)使用以下代码段:

yourTextBox.Text = ...;
yourTextBox.DataBindings["Text"].WriteValue();

答案 1 :(得分:1)

如果内存服务,WinForms(可能还有WebForms)中的数据绑定使用控制焦点中的更改来检测字段中的数据何时发生更改。

在代码隐藏中修改控件的值时,通常不会更改控件焦点。因此,没有任何东西能够在肋骨中引入数据绑定引擎,并且需要重新评估数据。