数据绑定问题

时间:2014-07-25 02:54:30

标签: c# xaml windows-phone-8

我遇到一个主要问题,即将我的数据从TextBox绑定到ViewModel To TextBlock。我已经设置了以下Xaml代码:

<Page
x:Class="digiBottle.MainPage"
DataContext="{Binding Source=UserProfile}"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:digiBottle"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" 
      DataContext="{Binding Source=UserProfile}">

    <TextBlock HorizontalAlignment="Left" Margin="219,72,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="32" Width="232" Text="{Binding userFirstName, Mode=OneWay}"/>
    <TextBox HorizontalAlignment="Left" Margin="39,72,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="111" Text="{Binding userFirstName, UpdateSourceTrigger=PropertyChanged}"/>

</Grid>

我尝试用作源的.cs文件定义如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace digiBottle.Model

{         public class UserProfile:INotifyPropertyChanged             {

    public int ID { get; set; }
    public string userFirstName;
    public string userLastName { get; set; }
    public int age { get; set; }
    public int weight { get; set; }
    public int height { get; set; }
    public DateTime signupTime { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;

    public UserProfile()
    {
        userFirstName = "First Name";
    }


    private void RaisePropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

    }

    public UserProfile getCopy()
    {
        UserProfile copy = (UserProfile)this.MemberwiseClone();
        return copy;
        }
    }
}

尝试将我的TextBox和TextBlock绑定到UserProfile.cs Source中的userFirstName时,我做错了什么。任何帮助都将是一个重要的帮助!

谢谢

2 个答案:

答案 0 :(得分:1)

我在这里注意的第一件事是您的属性(setter)不会引发事件更改。您需要在属性设置器中调用RaisePropertyChanged。

我会像

那样写

私人字段

private String _userFirstName;

然后在构造函数

 public UserProfile()
 {
      this._userFirstName = "First Name";
 }

举办物业举办活动

public String UserFirstName
{
     get { return this._userFirstName; }
     set  
     {
         this._userFirstName = value;
         this.RaisePropertyChanged("UserFirstName");
     }
}

然后在XAML中,使用双向绑定

将其绑定到属性“UserFirstName”
<TextBlock HorizontalAlignment="Left" Margin="219,72,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="32" Width="232" Text="{Binding UserFirstName, Mode=OneWay}"/>
<TextBox HorizontalAlignment="Left" Margin="39,72,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="111" Text="{Binding UserFirstName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

答案 1 :(得分:1)

DataBinding起初可能很难理解。请参考Data binding for Windows Phone 8开始使用。

对于您的代码:以下是您需要的修补程序:

  1. 请记住,您只能绑定到某个属性。
  2. 您需要在设置操作上引发事件。
  3. 根据您想要的操作,您可能需要在文本框上进行双向绑定。
  4. 您需要为文本框和文本块设置DataContext。
  5. 以下是更改:

    CS

    public class UserProfile : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
    
        string user_first_name;
        public String UserFirstName
        {
            get { return user_first_name; }
            set
            {
                user_first_name = value;
                OnPropertyChanged("UserFirstName");
            }
        }
    
        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
    
    }
    
    
    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        public MainPage()
        {
            InitializeComponent();
    
            UserProfile up = new UserProfile();
            this.tb1.DataContext = up;
            this.tb2.DataContext = up;
        }
     }
    

    XAML

    <TextBlock x:Name="tb2" TextWrapping="Wrap" Text="{Binding UserFirstName}"/>
    <TextBox x:Name="tb1" HorizontalAlignment="Left" Height="72" Margin="14,475,0,0" Grid.Row="1" TextWrapping="Wrap" Text="{Binding UserFirstName, Mode=TwoWay}" VerticalAlignment="Top" Width="456" />