积极答复者
如何实现控件与变量的绑定

问题
-
我在书中找到了控件与控件之间绑定的方法,但我希望能实现控件与变量的绑定。
比如
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来实现
答案
-
能被绑定的必须是一个属性,或者是一个静态类的静态成员。所以答案是你要把你的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
- 已编辑 Jie BaoModerator 2012年1月30日 10:08
- 已标记为答案 nimingzhe2008 2012年1月30日 13:37
-
你要实现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
全部回复
-
能被绑定的必须是一个属性,或者是一个静态类的静态成员。所以答案是你要把你的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
- 已编辑 Jie BaoModerator 2012年1月30日 10:08
- 已标记为答案 nimingzhe2008 2012年1月30日 13:37
-
非常感谢。但我操作时遇到了一个小问题:把三个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不能实现双向绑定吗?
-
你要实现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