2010-02-03 33 views
0

我目前正在学习WPF(C#),并从我正在尝试工作的文本书中采取以下简单的数据绑定示例。WPF - 为什么对简单数据绑定的对象所做的更改没有反映回主窗口中的目标?

该示例显示一个简单的窗口,其中包含名称和年龄文本框以及生日按钮。

显示的名称和年龄在Person对象中表示。点击生日按钮时,年龄增加并显示一个消息框。

消息框显示“生日快乐,[姓名],年龄[++年龄]”。

E.g.如果屏幕上的名称是危险的,年龄是28岁,那么当您点击生日按钮时,消息框将显示“生日快乐,危险,29岁”。

年龄在Person对象中正确递增,但此信息不会通过绑定反映回屏幕。但是,如果您更改屏幕上的名称或年龄字段,则该信息在Person对象中正确更新。

书中的例子说明我应该看到更新的年龄反映回屏幕上。我可能错过了一些简单的东西,但我花了一些时间试图纠正这一点,但不知道什么是错的?预先感谢这个例子的任何帮助。

显示窗口中的XAML:

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel Name="stack"> 
     <TextBlock>Name:</TextBlock> 
     <TextBox Text="{Binding Path=Name}"/> 
     <TextBlock>Age:</TextBlock> 
     <TextBox Text="{Binding Path=Age}"/> 
     <Button Name="birthdayButton">Birthday</Button> 
    </StackPanel> 
</Window> 

背后的代码:在绑定

using System; using System.Windows; using System.Windows.Controls; 

namespace WpfApplication1 { 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
     Person person = new Person("Dangerous", 28); 

     public Window1() 
     { 
      InitializeComponent(); 

      stack.DataContext = person; 

      this.birthdayButton.Click += birthdayButton_Click; 
     } 

     void birthdayButton_Click(object sender, RoutedEventArgs e) 
     { 
      ++person.Age; 
      MessageBox.Show(
       string.Format("Happy Birthday, {0}, age {1}!", 
        person.Name, 
        person.Age), 
       "Birthday"); 
     } 
    } 

    public class Person 
    { 
     string name; 
     int age; 

     public Person() { } 

     public Person(string name, int age) 
     { 
      this.name = name; 
      this.age = age; 
     } 

     public string Name 
     { 
      get {return this.name;} 
      set {this.name = value;} 
     } 

     public int Age 
     { 
      get {return this.age;} 
      set {this.age = value;} 
     } 
    } 
} 

回答

0

首先你需要<TextBox Text="{Binding Path=Age, Mode=TwoWay}"/>你的Person对象也可能必须实现INotifyPropertyChanged并在年龄发生变化时提出适当的事件。 Check here查看如何实施INotifyPropertyChanged的示例。

+1

@klausbyskov:如果他没有实现INotifyPropertyChanged,那么肯定是这个原因。 关于Mode = TwoWay - 这是不必要的;当绑定启动到TextBox.Text属性时,它的默认模式是TwoWay。 – Shimmy 2010-02-03 13:16:22

+0

我错过了INotifyPropertyChanged,并且在更改我的Person类以实现此界面并在Age更改后引发事件后,我可以确认所有内容都正在工作。 此外,Shimmy说得对,Mode = TwoWay并不是必需的。 感谢您的帮助。 – Dangerous 2010-02-03 13:31:22

0

尝试设置:

<TextBox Text="{Binding UpdateSourceTrigger=PropertyChanged}"/> 

或者将其设置为显式更新手动通过Button Click事件处理程序,因为TextBox的默认值是LostFocus,并且单击按钮不会丢失从TextBox重点关注。

欲了解更多信息:Binding.UpdateSourceTrigger property。

相关问题