4

私は DataBinding についていくつか読んだことがありますが、ほとんどは SQL や XAML などの複雑なものです。私のプログラムにやりたいことは、変数の「値」が変更された場合、それをテキストボックスまたはラベルに書き込むことだけです。(Windows フォームを使用)

これまでのところ、私が持っているもの:

namespace DataBinding_Test
{
    public partial class Form1 : Form
    {

    BindingSource bs = new BindingSource();
    Class1 test = new Class1();

    public Form1()
    {
        InitializeComponent();

        test.name = "Hello";
        bs.DataSource = test;

        label1.DataBindings.Add(new Binding("Text", bs, "name", false, DataSourceUpdateMode.OnPropertyChanged));

    }

    private void button1_Click(object sender, EventArgs e)
    {
        test.name = textBox1.Text;
    }
  }
}

Class1 には、パブリック プロパティ名があるだけです。起動時に lable1 に「Hello」文字列が表示されます。次に、ボタンをクリックすると、名前のプロパティが変更されます。デバッグ時に、「bs」の実際の DataSource に新しいプロパティ値が含まれているのを見ましたが、ラベルには何も表示されません...

これを行うための本当に簡単な方法はありますか?

バックラウンドは次のとおりです。定期的に、RS232 を介してセンサー データのポーリングが行われます。1 つのセンサーの値が変化した場合、これをラベルまたはテキスト ボックスに表示したいと考えています。これで、バックラウンド スレッド タイマーは、GUI スレッドにアクセスするために呼び出しやその他の処理が必要になります。これはデータバインディングで簡単になると思っていましたが、そうではないようです:P

皆さん、素晴らしいサイト、素晴らしい仕事に感謝します! :)

4

5 に答える 5

3

実装せずに物事を機能させる別の方法INotifyPropertyChanged

class Class1
{
    private string name;

    public string Name
    {
        get { return name; }
        set
        {
            //Check if you are assigning the same value. Depends on your business logic
            //here is the simplest check
            if (Equals(name, value))
                return;
            name = value;
            OnNameChanged();
        }

        public event EventHandler NameChanged;

        protected virtual void OnNameChanged()
        {
            var handler = NameChanged;
            if (handler != null)
                handler(this, EventArgs.Empty);
        }
    }
}

Changedトリックは、プロパティの名前とサフィックスを組み合わせた名前のイベントを作成し、プロパティの値が変更されるたびにイベントを発生させることです

于 2013-09-13T11:45:15.137 に答える
2

コードが機能するためには、バインドされたクラスにINotifyPropertyChangedインターフェイスを実装する必要があります。それがなければ、バインディングは変更がいつ発生するかを単に知りません。クラスで何かが変更されたとき (セッター部分) と何が変更されたか (PropertyChangedEventArgs) をサブスクライバーに通知するロジックを実装する必要があります。あなたのクラスの例を見てください:

class Class1: INotifyPropertyChanged
{
    private string name = "";

    public string Name
    {
        get { return name; }
        set { name = value; NotifyPropertyChanged(); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged()
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs("Name"));
        }
    }
}

バインディングでプロパティ名を「name」から「Name」に変更します。

label1.DataBindings.Add(new Binding("Text", bs, "Name", false, DataSourceUpdateMode.OnPropertyChanged));
于 2013-09-13T11:44:12.747 に答える
-1

それがあなたが望むものかどうかはわかりませんが、control.Text プロパティを使用して、変数に含まれるものを Textbox または Label に書き込むことができます。

textBox1.Text ="Some other Text"

また

string variable = "Hello 2";
textBox1.Text = variable;

なぜデータバインディングを使用したいのですか? この方法の方がはるかに簡単です。

于 2013-09-13T11:36:05.893 に答える