none
關於DataBinding的問題 RRS feed

  • 問題

  • IDE: VS2008 SP1 C#
    OS: XP sp3
    Hi,大家好
    請教有個關於DataBinding的問題。
    我在Form上放了三個Button(button1,2 ,3)
    並在此類別加入一欄位(_bValue)及屬性(BoolValue)。
    將button1及2的"Enabled"的屬性Binding到BooValue。
    藉由button3來改變BooValue的值,看button1及2的Enabled狀態是否會變更。
    試的結果,並非如所想的,當BooValue的值變更,button1及2的狀態也跟著變。
    不知是觀念上有什麼錯誤?
    謝謝


    namespace DataBindingTest
    {
      public partial class Form1 : Form
      {
        bool _bValue = false;

        public bool BoolValue
        {
          get { return _bValue; }
          set { _bValue = value; }
        }

        public Form1()
        {
          InitializeComponent();

          this.button1.DataBindings.Add("Enabled", this, "BoolValue");
          this.button2.DataBindings.Add("Enabled", this, "BoolValue");
        }

        private void button3_Click(object sender, EventArgs e)
        {
          BoolValue = !BoolValue;
        }
      }
    }
    2009年4月29日 上午 08:04

解答

  • 實作
    INotifyPropertyChanging, INotifyPropertyChanged
    • 已提議為解答 Lolota Lee 2009年5月7日 上午 08:42
    • 已標示為解答 Lolota Lee 2009年5月11日 上午 01:18
    2009年4月30日 上午 12:32
  • 如好說大所述
    可實做該介面
    這樣控制屬性後控制項的值就會跟著動
    不實作介面也可以
    但需放入
    XXXChanging()
    XXXChanged()
    之類的事件到屬性設定區塊中

    http://www.dotblogs.com.tw/larrynung/
    • 已提議為解答 Lolota Lee 2009年5月7日 上午 08:42
    • 已標示為解答 Lolota Lee 2009年5月11日 上午 01:18
    2009年4月30日 上午 01:07

所有回覆

  • 依照你的需求,建議修改程式如下,DataBinding照您這樣用似乎跟MS的設計有點不同,參考下列網址看對您是否有幫助,謝謝!
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                this.button1.Enabled = BoolValue;
                this.button2.Enabled = BoolValue;
                
            }
    
            bool _bValue = false;
    
            public bool BoolValue
            {
                get { return _bValue; }
                set { _bValue = value; }
            }
    
            private void button3_Click(object sender, EventArgs e)
            {
                BoolValue = !BoolValue;
                this.button1.Enabled = BoolValue;
                this.button2.Enabled = BoolValue;
            }
        }
    }
    
    

    2009年4月29日 下午 12:16
  • 我試了下面幾種方式,有的可以有的不行。

    public partial class Form1 : Form
    {
          int _nCount = 0;
          string _MyStr = "123";
          bool _bValue = false;

          public string MyStr
          {
            get { return _MyStr; }
            set { _MyStr = value; }
          }
          public int Count
          {
            get { return _nCount; }
            set { _nCount = value; }
          }

          public bool BoolValue
          {
            get { return _bValue; }
            set { _bValue = value; }
          }
          public Form1()
          {
            InitializeComponent();

            this.textBox1.DataBindings.Add("Text", this, "MyStr", true);
            this.textBox2.DataBindings.Add("Text", this, "MyStr", true);

            this.numericUpDown1.DataBindings.Add("Value", this, "Count", true);
            this.numericUpDown2.DataBindings.Add("Value", this, "Count", true);

            this.button4.DataBindings.Add("Enabled", this, "BoolValue", true);
            this.button5.DataBindings.Add("Enabled", this, "BoolValue", true);
          }

          private void button1_Click(object sender, EventArgs e)
          {
            //修改textBox1.Text的值後按下button1,textBox2.text及MyStr的值都會變。
            MyStr = textBox2.Text;
            MessageBox.Show(MyStr);
          }

          private void button2_Click(object sender, EventArgs e)
          {
            //修改numericUpDown1值後,按下button2,則numericUpDown1的值及Count會變
            MessageBox.Show(Count.ToString());
          }

          private void button3_Click(object sender, EventArgs e)
          {
            //變更BoolValue的值, button4及5都不會變。
            BoolValue = !BoolValue;
            //button4.Enabled = !button4.Enabled;
            MessageBox.Show(BoolValue.ToString());
          }
     }

    若藉由Form上的元件去變更值,則Binding的屬性會變。
    若直接變更屬性的值,則Binding的元件其屬性不會跟著變。
    Binding的用意,不就是不管哪邊有變更,另一邊應該跟著變不是嗎?
    不知道是我的觀念哪邊不對?
    謝謝您的回覆。
    2009年4月29日 下午 11:31
  • 實作
    INotifyPropertyChanging, INotifyPropertyChanged
    • 已提議為解答 Lolota Lee 2009年5月7日 上午 08:42
    • 已標示為解答 Lolota Lee 2009年5月11日 上午 01:18
    2009年4月30日 上午 12:32
  • 如好說大所述
    可實做該介面
    這樣控制屬性後控制項的值就會跟著動
    不實作介面也可以
    但需放入
    XXXChanging()
    XXXChanged()
    之類的事件到屬性設定區塊中

    http://www.dotblogs.com.tw/larrynung/
    • 已提議為解答 Lolota Lee 2009年5月7日 上午 08:42
    • 已標示為解答 Lolota Lee 2009年5月11日 上午 01:18
    2009年4月30日 上午 01:07