2016-04-29 2 views
0

Abend alle,Datenbindung von Elementvariablen in einer Klasse. WPF

Ich arbeite an einer WPF-Anwendung, die Datenbindung verwendet, um Variablen einer Klasse an eine Benutzeroberfläche zu binden. Ich habe meine Klasse eingerichtet, um INotifyPropertyChanged zu integrieren, die in meinen anderen Projekten gut funktioniert. Es sieht derzeit wie folgt aus:

namespace playerWPF 
{ 
    class GameInfo : INotifyPropertyChanged 
    { 

     public GameInfo(string _teamName) //constructor 
     { 
      this.TeamName = _teamName; 
      this.OppositionName = "Opposition"; 
      this.TeamScore = 0; 
      this.OppositionScore = 0; 
      this.Question = "What is your team name?"; 



     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     private void OnPropertyChanged(string property) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(property)); 
      } 
     } 

     private string question; 

     public string Question 
     { 
      get 
      { 
       return question; 
      } 
      set 
      { 
       question = value; 
       OnPropertyChanged("Question"); 
      } 
     } 

//and so on for all the other variables in a similiar fashion 

Meine XAML sieht wie folgt aus:

<Window x:Class="playerWPF.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:playerWPF" 
     xmlns:system="clr-namespace:System;assembly=mscorlib" 
     Title="MainWindow" Height="350" Width="525" 
     Name="MainWindowName"> 

    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="112*"/> 
      <RowDefinition Height="207*"/> 
     </Grid.RowDefinitions> 
     <TextBox x:Name="answerBox" HorizontalAlignment="Left" Height="32" Margin="58,60,0,0" TextWrapping="Wrap" Text="Answer here..." VerticalAlignment="Top" Width="371" Grid.Row="1"/> 
     <Button x:Name="submitButton" Content="Submit" Click="submitButton_Click" HorizontalAlignment="Left" Height="35" Margin="199,97,0,0" VerticalAlignment="Top" Width="92" Grid.Row="1"/> 
     <Label x:Name="teamNameLabel" Content="{Binding TeamName}" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Height="25" Width="74"/> 
     <Label x:Name="oppositionName" Content="{Binding OppositionName}" HorizontalAlignment="Left" Margin="328,9,0,0" VerticalAlignment="Top" Width="101"/> 
     <Label x:Name="responseLabel" Content="{Binding Question}" HorizontalAlignment="Left" Height="49" Margin="58,6,0,0" VerticalAlignment="Top" Width="371" Grid.Row="1"/> 
     <Label x:Name="teamScoreLabel" Content="{Binding TeamScore}" HorizontalAlignment="Left" Margin="19,35,0,0" VerticalAlignment="Top" Width="65"/> 
     <Label x:Name="oppositionScoreLabel" Content="{Binding OppositionScore}" HorizontalAlignment="Left" Margin="340,40,0,0" VerticalAlignment="Top" Width="65"/> 

    </Grid> 
</Window> 

ich eine Art dieser Klasse als statisches Feld initialisieren in meinem MainWindow wie so: private static GameInfo gameInfo;

Und in Der Hauptfensterkonstruktor Ich weise ihm eine neue Instanz zu: gameInfo = new GameInfo("Team");

Es ist mein Verständnis, dass dies einige von ändern sollte Die Beschriftungen auf der Benutzeroberfläche entsprechen ihren standardmäßigen konstruierten Werten. Dies ist jedoch nicht der Fall. Kann jemand Licht abwerfen?

+0

Ebenfalls erwähnenswert, dass ich Datacontext = this; in meinem MainWindow-Konstruktor auch. – James

+0

DataContext sollte 'gameInfo' sein und Bindings sollten' gameInfo.' nicht enthalten, nur der Name der Eigenschaft. – Crowcoder

+0

@Crowcoder Ich habe meine Bindungen geändert und meine Frage bearbeitet (obwohl sie die Werte in der spezifischen Klasseninstanz widerspiegeln?), Aber ich bin ziemlich sicher, dass der DataContext im Konstruktor der MainWindow sein muss, die ich habe bereits. Ich habe es noch nirgends gesehen – James

Antwort

2

Sie möchten gameInfo wie ein View-Modell verwenden, wenn Sie dem MVVM-Muster folgen. So ändern

DataContext = this; //you don't want the data context to be the window itself 

zu

DataContext = gameInfo; 

Dann Ihre Bindungen sind einfach

{Binding <property name>}