none
如何实现控件与变量的绑定 RRS feed

  • 问题

  • 我在书中找到了控件与控件之间绑定的方法,但我希望能实现控件与变量的绑定。

    比如

    XAML

    <Window x:Class="计算器.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">    
    
        <Grid  >
            <TextBox Height="23" Name="A"  Width="64" />
           
        </Grid>
    </Window>
    
    


    C#

    namespace 计算器
    {
        
        public partial class MainWindow : Window
        {
            int a;
            public MainWindow()
            {
                InitializeComponent();
            }
    
          
        }
    }
    

    如何将控件TextBox与int a绑定到一起?

    最好用XAML来实现

    2012年1月30日 8:42

答案

  • 能被绑定的必须是一个属性,或者是一个静态类的静态成员。所以答案是你要把你的a写成属性,然后将a的载体 MainWindow实例作为MainWindow的DataContext, 如下:

    <Window x:Class="WpfApplication6.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
      <Grid>
        <TextBox Height="23" Name="A" Width="64" Text="{Binding a, UpdateSourceTrigger=PropertyChanged}"/>
      </Grid>
    </Window>
    
    


    C#:

      public partial class MainWindow : Window
      {
        public int a { get; set; }
        public MainWindow()
        {
          InitializeComponent();
          this.DataContext = this;
        }
      }
    

     

    Sincerely,


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年1月30日 10:08
    版主
  • 你要实现c属性的改变去更新绑定控件属性的话,你的绑定源叔要实现INotifyPropertyChanged接口,我想这个书上有吧?

    具体如下:

      public partial class MainWindow : Window, INotifyPropertyChanged
      {
        private int m_a, m_b, m_c;
        public int a
        {
          get { return m_a; }
          set
          {
            m_a = value;
            OnPropertyChanged("a");
          }
        }
    
        public int b
        {
          get { return m_b; }
          set
          {
            m_b = value;
            OnPropertyChanged("b");
          }
        }
    
        public int c
        {
          get { return m_c; }
          set
          {
            m_c = value;
            OnPropertyChanged("c");
          }
        }
    
        private void OnPropertyChanged(string name)
        {
          if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    
        public MainWindow()
        {
          InitializeComponent();
        }
    
        #region INotifyPropertyChanged Members
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        #endregion
      }
    

     

    ---------------------------------------
    不过我给你写了一个不需要事件,自动更新结果的例子,你学习一下:
      <StackPanel>
        <TextBox Text="{Binding a, UpdateSourceTrigger=PropertyChanged}"/>
        <TextBox Text="{Binding b, UpdateSourceTrigger=PropertyChanged}"/>
        <TextBox Text="{Binding c, UpdateSourceTrigger=PropertyChanged}"/>
      </StackPanel>
    

    C#:
      public partial class MainWindow : Window, INotifyPropertyChanged
      {
        private int m_a, m_b, m_c;
        public int a
        {
          get { return m_a; }
          set
          {
            m_a = value;
            Calculate();
            OnPropertyChanged("a");
          }
        }
    
        public int b
        {
          get { return m_b; }
          set
          {
            m_b = value;
            Calculate();
            OnPropertyChanged("b");
          }
        }
    
        public int c
        {
          get { return m_c; }
          set
          {
            m_c = value;
            OnPropertyChanged("c");
          }
        }
    
        private void Calculate()
        {
          c = a + b;
        }
    
        private void OnPropertyChanged(string name)
        {
          if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    
        public MainWindow()
        {
          InitializeComponent();
          this.DataContext = this;
        }
    
        #region INotifyPropertyChanged Members
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        #endregion
      }
    
    Sincerely,

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    • 已建议为答案 Jarrey 2012年1月31日 1:57
    • 已标记为答案 nimingzhe2008 2012年1月31日 4:29
    2012年1月30日 14:18
    版主

全部回复

  • 能被绑定的必须是一个属性,或者是一个静态类的静态成员。所以答案是你要把你的a写成属性,然后将a的载体 MainWindow实例作为MainWindow的DataContext, 如下:

    <Window x:Class="WpfApplication6.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
      <Grid>
        <TextBox Height="23" Name="A" Width="64" Text="{Binding a, UpdateSourceTrigger=PropertyChanged}"/>
      </Grid>
    </Window>
    
    


    C#:

      public partial class MainWindow : Window
      {
        public int a { get; set; }
        public MainWindow()
        {
          InitializeComponent();
          this.DataContext = this;
        }
      }
    

     

    Sincerely,


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年1月30日 10:08
    版主
  • 非常感谢。但我操作时遇到了一个小问题:把三个TextBox空间分别绑定到类型为string的属性a,b,c.然后我为一个Button添加了一个事件

    c=(int.Parse(a)+int.Parse(b)).ToString();

    调试时点击Button后,与c绑定的Textbox没有反应。后来我修改了一下事件

    int d=int.Parse(a)+int.Parse(b);

    textbox3=d.ToString();//textbox3是与c绑定的TextBox控件

    这次调试成功。

    请问这是怎么回事,c和textbox3不能实现双向绑定吗?

    2012年1月30日 13:52
  • 你要实现c属性的改变去更新绑定控件属性的话,你的绑定源叔要实现INotifyPropertyChanged接口,我想这个书上有吧?

    具体如下:

      public partial class MainWindow : Window, INotifyPropertyChanged
      {
        private int m_a, m_b, m_c;
        public int a
        {
          get { return m_a; }
          set
          {
            m_a = value;
            OnPropertyChanged("a");
          }
        }
    
        public int b
        {
          get { return m_b; }
          set
          {
            m_b = value;
            OnPropertyChanged("b");
          }
        }
    
        public int c
        {
          get { return m_c; }
          set
          {
            m_c = value;
            OnPropertyChanged("c");
          }
        }
    
        private void OnPropertyChanged(string name)
        {
          if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    
        public MainWindow()
        {
          InitializeComponent();
        }
    
        #region INotifyPropertyChanged Members
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        #endregion
      }
    

     

    ---------------------------------------
    不过我给你写了一个不需要事件,自动更新结果的例子,你学习一下:
      <StackPanel>
        <TextBox Text="{Binding a, UpdateSourceTrigger=PropertyChanged}"/>
        <TextBox Text="{Binding b, UpdateSourceTrigger=PropertyChanged}"/>
        <TextBox Text="{Binding c, UpdateSourceTrigger=PropertyChanged}"/>
      </StackPanel>
    

    C#:
      public partial class MainWindow : Window, INotifyPropertyChanged
      {
        private int m_a, m_b, m_c;
        public int a
        {
          get { return m_a; }
          set
          {
            m_a = value;
            Calculate();
            OnPropertyChanged("a");
          }
        }
    
        public int b
        {
          get { return m_b; }
          set
          {
            m_b = value;
            Calculate();
            OnPropertyChanged("b");
          }
        }
    
        public int c
        {
          get { return m_c; }
          set
          {
            m_c = value;
            OnPropertyChanged("c");
          }
        }
    
        private void Calculate()
        {
          c = a + b;
        }
    
        private void OnPropertyChanged(string name)
        {
          if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    
        public MainWindow()
        {
          InitializeComponent();
          this.DataContext = this;
        }
    
        #region INotifyPropertyChanged Members
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        #endregion
      }
    
    Sincerely,

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    • 已建议为答案 Jarrey 2012年1月31日 1:57
    • 已标记为答案 nimingzhe2008 2012年1月31日 4:29
    2012年1月30日 14:18
    版主
  • 非常感谢。
    2012年1月31日 4:30