2013-07-11 2 views
0

tout d'abord désolé pour mon anglais.La propriété de liaison de données ne fonctionne pas

Je développe une application WP7, et je n'ai pas encore complètement compris la structure de liaison de données. J'ai une page qui a des données obtenues par la liaison de données. Les données sont générées dans le fichier .cs, et cela fonctionne très bien.

Mais sur une autre page j'ai aussi des données qui sont obtenues à partir de la liaison de données, mais je veux que cela vienne d'un texte d'entrée de l'interface utilisateur à la place. C'est simple, juste une zone de texte et un bloc de texte, donc l'utilisateur écrit quelque chose sur la zone de texte et ainsi il apparaît sur le bloc de texte qui est sur la même page. Mais ça ne marche pas, le bloc de texte reste vide.

Il est quelque chose comme ceci:

<TextBox Name="TestInput"> 
<TextBlock Text="{Binding TestText}"> 

Au-dessus est ce qui est sur le XAML.

public partial class NewItem : PhoneApplicationPage 
{ 
    public String TestText { get; set; } 

    public NewItem() 
    { 
     InitializeComponent(); 
     TestText = "TestInput.Text"; 
    } 
} 

Et ce qui précède est ce qui est sur le C#.

MAIS !! Cela ne s'arrête pas là. Puisque le bloc de texte n'affichait rien, j'ai fini par essayer désespérément d'assigner une certaine chaîne à la propriété TestText. Comme ceci:

TestText = "HELLO WORLD"; 

Mais lorsque l'application démarre et que la page se charge, le bloc de texte n'affiche rien. Je ne comprends pas ce qui me manque ou ce qui ne va pas.

J'apprécierais que quelqu'un puisse m'éclaircir la structure de liaison de données, ou au moins m'expliquer ce que j'ai fait de mal pour que je puisse comprendre moi-même.

Merci d'avance les gars!

Répondre

0

Vous devez affecter le DataContext avant de vouloir l'effet de liaison. Ainsi, lorsque vous modifiez la zone de texte, vous écrivez le code dans l'événement textchanged.

this.DataContext=TestText 

Et un changement supplémentaire que vous devez effectuer est que vous ne définissez pas réellement le property.It devrait être comme

TestText=TestInput.Text

0

pour votre compréhension de la liaison je suis mettre un simple jeu exemple .. juste suivre ceci .. c'est vous page sur laquelle vous liez les données de textbox à someproperty textboxText..when vous avez fini d'écrire dans ce textbox.then tous les writtentext viennent automatiquement dans cette propriété. et cette propriété est également liée à textbloack alors quand votre textbloack aura le focus, il obtiendra le get de la propriété et le remplira automatiquement.

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> 
    <StackPanel Orientation="Horizontal" > 
     <TextBox x:Name="testTextbox" Height="50" Width="200" Text="{Binding TextboxText,Mode=TwoWay}" /> 
     <TextBlock x:Name="testTextblock" Height="50" Width="1000" Text="{Binding TextboxText,Mode=OneWay}" Foreground="White" /> 
    </StackPanel> 
</Grid> 

ceci est votre classe page.cs dans lequel j'ai également montré vous comment implémenter inotifyproperty changed..it vous aidera à l'avenir ..

public sealed partial class MainPage : Page,INotifyPropertyChanged 
{ 
    public MainPage() 
    { 
     this.InitializeComponent(); 
     this.DataContext = this; 
    } 

    private string _TextboxText; 
    public string TextboxText 
    { 
     get 
     { 
      return _TextboxText; 
     } 
     set 
     { 
      _TextboxText = value; 

      FirePropertyChanged("TextboxText"); 
      testTextblock.UpdateLayout(); 

     } 
    } 


    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected void FirePropertyChanged(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
+0

Pourquoi êtes-vous en utilisant le mot-clé "this" sur InitializeComponent(); ??? Est-ce vraiment nécessaire? Je pensais que "ceci" devait se référer à l'instance actuelle, je veux dire, quelle serait la différence entre "InitializeComponent();" et ça.InitializeComponent(); "Je ne comprends pas –

+0

il est même peut-être que je l'ai fait par erreur .. – loop

Questions connexes