2010-02-03 13 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。

相關問題