web-dev-qa-db-ja.com

TextBoxのデータバインディング

タイプFruitのオブジェクトを格納する基本プロパティがあります。

Fruit food;
public Fruit Food
{
    get {return this.food;}
    set
    {
        this.food= value;
        this.RefreshDataBindings();
    }
}

public void RefreshDataBindings()
{
    this.textBox.DataBindings.Clear();
    this.textBox.DataBindings.Add("Text", this.Food, "Name");
}

そのため、フォームの外でthis.Foodを設定すると、UIに表示されます。

this.Foodを変更すると、正しく更新されます。プログラムでUIを次のように変更した場合:

this.textBox.Text = "NewFruit"、this.Foodは更新されません。

なぜこれができるのでしょうか? Fruit.NameにもINotifyPropertyChangedを実装しましたが、それでも同じです。

29
Joan Venge

INotifyPropertyChangedを実装し、データバインディングコードを次のように変更することをお勧めします。

this.textBox.DataBindings.Add("Text",
                                this.Food,
                                "Name",
                                false,
                                DataSourceUpdateMode.OnPropertyChanged);

それはそれを修正します。

デフォルトのDataSourceUpdateModeOnValidationであるため、OnPropertyChangedを指定しない場合、検証が完了するまでモデルオブジェクトは更新されません。

57
Joepro

仲介者として機能し、バインディングを支援するには、bindingsourceオブジェクトが必要です。次に、ユーザーインターフェイスを更新する代わりに、下線モデルを更新します。

var model = (Fruit) bindingSource1.DataSource;

model.FruitType = "oranges";

bindingSource.ResetBindings();

Windows Forms のBindingSourceと単純なデータバインディングを参照してください。

1

次のコードを使用できます

textBox1.DataBindings.Add("Text", model, "Name", false, DataSourceUpdateMode.OnPropertyChanged);

どこ

  • "Text" –テキストボックスのプロパティ
  • model –モデルオブジェクトはここにコードを入力します
  • "Name" –テキストボックスをバインドするモデルの値。
0
user3838082