数据绑定无效

时间:2016-01-30 08:29:32

标签: c# windows xaml win-universal-app windows-10-universal

我试图理解数据绑定的概念,我了解到数据绑定是将UI元素绑定到对象的方式,这样任何一个中的任何更改都会影响另一个(在双向绑定的情况下) ,但这不适用于这个简单的例子:

我的班级:

namespace dataBinding.Models
{
public class person
{
    public string name { get; set; }

    public override string ToString()
    {
        return this.name;
    }
}
}

XAML:

xmlns:models="using:dataBinding.Models"
<Page.DataContext>
    <models:person x:Name="personObject" name="Person's Name"/>
</Page.DataContext>

    <TextBlock VerticalAlignment="Center" HorizontalAlignment="Right" 
               Text="{Binding name, Mode=TwoWay}" />

    <Button Name="changeNameButton"
            VerticalAlignment="Center" 
            HorizontalAlignment="Left"
            Content="Change Name" />

C#代码:

namespace dataBinding
{
public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        changeNameButton.Click += ChangeNameButton_Click;
    }

    private void ChangeNameButton_Click(object sender, RoutedEventArgs e)
    {
        personObject.name = "New Name";
    }
}
}

当我运行应用程序时,TextBlock会显示&#34;人员姓名&#34;但是点击changeName按钮并不会改变TextBlock中显示的内容,所以我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

您错过了INotifyPropertyChanged接口实现。您的XAML不知道它已被更改。

易于修复,使用https://github.com/Fody/PropertyChanged它将添加代码以通知每个人该属性已更改。

[ImplementPropertyChanged]
public class person
{
    public string name { get; set; }

    public override string ToString()
    {
        return this.name;
    }
}

答案 1 :(得分:0)

简单数据绑定(2012年4月10日 Mahak Gupta发布的原始代码

第一步:首先我们在项目中创建一个网格:

<Grid x:Name="StuInfo">
     <Grid.ColumnDefinitions>
          <ColumnDefinition Width="Auto" MinWidth="77"></ColumnDefinition>
          <ColumnDefinition></ColumnDefinition>
     </Grid.ColumnDefinitions>
     <Grid.RowDefinitions>
          <RowDefinition></RowDefinition>
          <RowDefinition></RowDefinition>
          <RowDefinition></RowDefinition>
          <RowDefinition></RowDefinition>
          <RowDefinition></RowDefinition>
     </Grid.RowDefinitions>
</Grid>

Step2:之后我们在程序中创建了两个TextBlocks和两个TextBoxes,我们还创建了一个Button(Next)来根据程序查看Next Record。

<TextBlock Text="First Name" Margin="10"></TextBlock>
<TextBlock Text="Last Name" Margin="10" Grid.Row="1"></TextBlock>
<TextBox Text="{Binding fname}" Margin="10" Grid.Column="1"></TextBox>
<TextBox Text="{Binding lname}" Margin="10" Grid.Column="1"  Grid.Row="1"></TextBox>
<Button HorizontalAlignment="Left" Margin="0,12,0,9" Name="button1" Width="75" Grid.Column="1" Grid.Row="2">Next</Button>

check this answer

步骤3:现在我们在.cs页面中添加一个Loaded Event处理程序。当客户端想要加载应用程序时,将调用此事件:

public partial class Window1 : Window
{
   public Window1()
   {
        InitializeComponent();
        this.Loaded += new RoutedEventHandler(Page_Loaded);
   }
   void Page_Loaded(object sender, RoutedEventArgs e)
   {

   }
}

第4步:现在我们在程序中添加一个类:

public class Stu
{
    public string fname { get; set; }
    public string lname { get; set; }
}  

步骤5:现在我们在Loded Event Handler中编写以下代码:

void Page_Loaded(object sender, RoutedEventArgs e)
{
   Stu s = new Stu();
    {
      s.fname = "Mahak";
      s.lname = "Garg";
    };
      this.StuInfo.DataContext = s;
}

正如我们在.xaml页面中提到TextBox中的Binding:

<TextBox Text="{Binding fname}" Margin="10" Grid.Column="1"></TextBox>
<TextBox Text="{Binding lname}" Margin="10" Grid.Column="1"  Grid.Row="1"></TextBox>

输出结果为:

enter image description here

Step6:现在我们添加另一个Event Handler,用于Next Button:

public Window1()
{
   InitializeComponent();
   this.Loaded += new RoutedEventHandler(Page_Loaded);
   this.button1.Click += new RoutedEventHandler(button1_Click);
}
void button1_Click(object sender, RoutedEventArgs e)
{
   Stu s = new Stu();
    {
       s.fname = "Juhi";
       s.lname = "Gupta";
    };
   this.StuInfo.DataContext = s;
}

这里我们在程序中添加另一个数据。当我们点击Next按钮时,输出将是:

enter image description here