2010-02-03 3 views
0

저는 현재 WPF (C#)를 배우고 있으며 다음과 같은 간단한 데이터 바인딩 예제를 사용하려고합니다.WPF - 간단한 데이터 바인딩에 대한 개체의 변경 내용이 주 창에서 대상으로 다시 반영되지 않는 이유는 무엇입니까?

이 예제에서는 이름과 나이 텍스트 상자 및 생일 단추가 포함 된 간단한 창이 표시됩니다.

표시되는 이름과 나이는 Person 객체로 표현됩니다. 생일 버튼을 클릭하면 나이가 증가하고 메시지 상자가 표시됩니다.

메시지 상자에 "생일 축하 해요, [이름], 나이 [++ Age]"가 표시됩니다.

예. 화면상의 이름이 Dangerous이고 나이가 28 일 때 생일 버튼을 클릭하면 메시지 상자에 "Happy Birthday, Dangerous, age 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을 구현하고 나이가 변경되면 적절한 이벤트를 발생시켜야 할 수도 있습니다. INotifyPropertyChanged을 구현하는 방법의 예는 Check here을 참조하십시오.

+1

@klausbyskov : 그가 INotifyPropertyChanged를 구현하지 않았다면 그 이유가 확실합니다. 모드 = TwoWay와 관련하여 - 비 효과적입니다. TextBox.Text 속성에 바인딩이 시작되면 기본 모드는 TwoWay입니다. – Shimmy

+0

INotifyPropertyChanged가 누락되었습니다.이 인터페이스를 구현하고 Age 변경 후 이벤트를 발생시키기 위해 Person 클래스를 변경 한 후에 모든 것이 현재 작동 중임을 확인할 수 있습니다. 또한 Shimmy는 Mode = TwoWay가 필요하지 않다고 말할 수있었습니다. 도움 주셔서 감사합니다. – Dangerous

0

시도 설정 :

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

또는 명시 적으로 설정하고 업데이트를 TextBox의 기본값이 LostFocus이고 단추를 클릭해도 th를 잃지 않으므로 Button Click 이벤트 핸들러를 통해 수동으로 TextBox에서 포커스를 가져옵니다.

자세한 내용은 Binding.UpdateSourceTrigger 속성을 참조하십시오.

관련 문제