Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Binding WPF-为什么对简单数据绑定的对象所做的更改没有反映回主窗口中的目标?_Binding - Fatal编程技术网

Binding WPF-为什么对简单数据绑定的对象所做的更改没有反映回主窗口中的目标?

Binding WPF-为什么对简单数据绑定的对象所做的更改没有反映回主窗口中的目标?,binding,Binding,我目前正在学习WPF(C#),并从一本我正在努力学习的教科书中选取了以下简单的数据绑定示例 该示例显示一个简单窗口,其中包含一个名称和年龄文本框以及一个生日按钮 显示的姓名和年龄在Person对象中表示。单击生日按钮时,年龄将增加,并显示一个消息框 消息框显示“生日快乐,[姓名],年龄[++年龄]” 例如,如果屏幕上的姓名是危险的,年龄是28岁,那么当您单击生日按钮时,消息框将显示“生日快乐,危险,29岁” 年龄在Person对象中正确递增,但此信息不会通过绑定反射回屏幕。但是,如果更改屏幕上的

我目前正在学习WPF(C#),并从一本我正在努力学习的教科书中选取了以下简单的数据绑定示例

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

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

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

例如,如果屏幕上的姓名是危险的,年龄是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;}
        }
    }
}
使用系统;使用System.Windows;使用System.Windows.Controls;
命名空间WpfApplication1{
/// 
///Window1.xaml的交互逻辑
/// 
公共部分类Window1:Window
{
人员=新人员(“危险”,28);
公共窗口1()
{
初始化组件();
stack.DataContext=person;
this.birthdayButton.Click+=birthdayButton\u Click;
}
作废生日按钮\单击(对象发送者,路由目标e)
{
++人、年龄;
MessageBox.Show(
Format(“生日快乐,{0},年龄{1}!”,
人名,,
人,年龄),,
“生日”);
}
}
公共阶层人士
{
字符串名;
智力年龄;
公众人物(){}
公众人物(字符串名称,整数年龄)
{
this.name=名称;
这个。年龄=年龄;
}
公共字符串名
{
获取{返回this.name;}
设置{this.name=value;}
}
公共信息
{
获取{返回this.age;}
设置{this.age=value;}
}
}
}

尝试在绑定中设置:

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

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


有关更多信息,请阅读:property.

首先,您需要
您的
Person
对象可能还必须实现
INotifyPropertyChanged
,并在年龄更改时引发适当的事件。关于如何实现
INotifyPropertyChanged

@klausbyskov的示例:如果他没有实现INotifyPropertyChanged,那么肯定这就是原因。关于模式=双向-这是不必要的;当启动到TextBox.Text属性的绑定时,它的默认模式是双向的。我缺少INotifyPropertyChanged,在更改我的Person类以实现此接口并在年龄更改后引发事件后,我可以确认现在一切正常。此外,Shimmy说Mode=TwoWay不是必需的,这是正确的。谢谢你的帮助。