2016-05-21 6 views
1

In meiner XAML Ich tue das folgendeC# WPF Bindung nicht nehmen Daten von Immobilien

<Label Content="{Binding ElementName=Root, Path=UserData.Email, Mode=OneWay}" /> 

das Root Element ist mein Window selbst und die UserData Ist ein get; private set; Eigenschaft auto in meinem Code-Behind-Datei, die Email Eigenschaft ist "get-only" und ist vom Typ string.

Das Objekt UserData wird gesetzt, nachdem der Benutzer sich angemeldet hat. Die Bindung übernimmt jedoch nicht den Wert des Objekts. Ich habe überprüft, dass das Objekt tatsächlich die richtigen Daten enthält und nicht null ist. Was fehlt mir hier?

+0

Setzen Sie den 'Datacontext' Ihres Labels auf Ihr' Model'? –

+0

Nein, wie soll ich das machen? Da ich 'DataContext' vorher noch nicht benutzt habe, rate mal, was es ist. – HyunMi

+1

Zuerst benötigen Sie eine Klasse, die 'INotifyPropertyChanged' implementiert. Diese Klasse wäre Ihr' Model View' Teil. Dann müssen Sie ein Objekt dieser Klasse instanziieren und den DataContext auf das Objekt festlegen. Grundsätzlich weiß es, wo es hinschauen soll. Sie müssen wirklich ein gutes Tutorial finden. –

Antwort

0

Ich ging voran und schuf eine Hallo Welt Version dafür. Hier ist das XML. Dies sollte einfach das Banner ändern, wenn auf den Text im Textfeld geklickt wird. Ich konnte kein super einfaches Beispiel finden, also habe ich einfach eins gemacht. Offensichtlich gibt es weit fortgeschrittene Wege, um dies zu tun, aber es sollte für eine einfache Version aus bauen.

<Window x:Class="Hello_World.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Label Name="MyLabel" Content="{Binding MyLabel}" HorizontalAlignment="Left" Margin="58,37,0,0" VerticalAlignment="Top" Height="65" Width="423" FontSize="44"/> 
     <TextBox Name="MyTextBox" HorizontalAlignment="Left" Height="28" Margin="163,162,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="163"/> 
     <Button Content="Change Banner" HorizontalAlignment="Left" Margin="251,209,0,0" VerticalAlignment="Top" Width="109" Click="Button_Click"/> 

    </Grid> 
</Window> 

Als nächstes ist die Modelview, die den INotifyPropertyChanged-Schnittstelle implementiert. Beachten Sie, dass Sie das Singleton-Muster für die enthaltenen Eigenschaften verwenden müssen. Auf diese Weise können Sie die Methode OnPropetyChanged() immer dann aufrufen, wenn die Eigenschaft festgelegt ist.

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

namespace Hello_World 
{ 
    public class ModelView: INotifyPropertyChanged 
    { 


     private string _myLabel; 

     public string MyLabel 
     { 
      get { return _myLabel; } 
      set 
      { 
       _myLabel = value; 
       OnPropertyChanged("MyLabel"); 
      } 
     } 






     public event PropertyChangedEventHandler PropertyChanged; 

     private void OnPropertyChanged(string propetyName) 
     { 
      if(PropertyChanged != null) 
      PropertyChanged(this,new PropertyChangedEventArgs(propetyName)); 

     } 

    } 
} 

schließlich das Hauptfenster. Setzen Sie die DataContext im Hauptkonstruktor. Hinweis Ich hätte DataContext des Hauptgitters festlegen können, und alle untergeordneten Elemente erben dasselbe DataContext. Dies würde verhindern, dass Sie alle Komponenten einzeln einstellen müssen.

namespace Hello_World 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     private ModelView MyModel; 


     public MainWindow() 
     { 
      InitializeComponent(); 
      MyModel = new ModelView(); 

      // Here's where I'm setting the object to look at. 
      MyLabel.DataContext = MyModel; 
      // Now I don't need to access the textbox directly. 
      MyModel.MyLabel = "Hello World"; 


     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      MyModel.MyLabel = MyTextBox.Text; 
     } 


    } 
} 
+0

Danke für die Mühe und Erklärung. Wenn ich einen kleinen Vorschlag machen kann, würde ich 'nameof' verwenden, wenn ich' OnPropertyChanged' von Ihrer 'MyLabel'-Eigenschaft aus anrufe – HyunMi