2016-11-25 5 views
0

Ich habe ein Ansichtsmodell erstellt, das eine einzige Eigenschaft für ein Studentenmodell aufweist, das ich dann an ein Steuerelement in meinem XAML binde. Aber nichts erscheint, wenn ich die Anwendung ausführe.WPF-MVVM-Eigenschaftenbindung funktioniert nicht

ich in meinem App.xaml.cs setze Datenkontext wie folgt:

protected override void OnStartup(StartupEventArgs e) 
{   
    base.OnStartup(e); 

    Registrationformusinemvvm.MainWindow window = new MainWindow(); 

    VMUser VM = new VMUser(); 

    window.DataContext = VM; 

    window.Show(); 

} 

Warum arbeitet die Bindung nicht wahr?

Dies ist meine Ansicht nach Modell:

public class VMUser:BaseClass 
    {  
    private student _currentStudent; 

    public student CurrentStudent 
    { 
     get { return _currentStudent; } 
     set { 
       _currentStudent = value; 
       OnPropertyChanged("CurrentStudent");  
     } 
    } 
    } 

Meine Studentenmodellklasse:

public class student:BaseClass 
{  
    private string name="sumit"; 

    public string Name 
    { 
     get { return name; } 
     set { name = value; OnPropertyChanged("Name"); } 
    } 

    private int rollNum; 

    public int RollNum 
    { 
     get { return rollNum; } 
     set { rollNum = value;OnPropertyChanged("RollNum"); } 
    } 

    private int phNum; 

    public int PhNum 
    { 
     get { return phNum; } 
     set { phNum = value;OnPropertyChanged("PhNum"); } 
    } 
    private string sub; 

    public string Sub 
    { 
     get { return sub; } 
     set { sub = value;OnPropertyChanged("Sub"); } 
    } 

} 

Meine XAML:

<Window x:Class="Registrationformusinemvvm.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:Registrationformusinemvvm" 
    xmlns:vm="clr-namespace:Registrationformusinemvvm.ViewModel" 
    mc:Ignorable="d" 

    Title="MainWindow" Height="350" Width="525"> 
    <!--<Window.DataContext> 
    <vm:VMUser/> 
    </Window.DataContext>--> 
    <Window.Resources> 

</Window.Resources> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="50"/> 
     <RowDefinition Height="50"/> 
     <RowDefinition Height="50"/> 
     <RowDefinition Height="50"/> 
     <RowDefinition Height="50"/> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="200"/> 
     <ColumnDefinition Width="200"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <TextBlock Text="Name" Grid.Column="0" Grid.Row="0" FontSize="14"  

    FontWeight="Bold" VerticalAlignment="Center" 
    HorizontalAlignment="Center"/> 
    <TextBlock Text="Roll Number" Grid.Column="0" Grid.Row="1" FontSize="14" 

    FontWeight="Bold" VerticalAlignment="Center" 

    HorizontalAlignment="Center"/> 
    <TextBlock Text="Subject" Grid.Column="0" Grid.Row="2" FontSize="14" 

    FontWeight="Bold" VerticalAlignment="Center" 
    HorizontalAlignment="Center"/> 
    <TextBlock Text="Phone Number" Grid.Column="0" Grid.Row="3" 
    FontSize="14" FontWeight="Bold" VerticalAlignment="Center" 
HorizontalAlignment="Center"/> 
    <TextBox Name="tbName" Text="{Binding CurrentStudent.Name,Mode=TwoWay, 
UpdateSourceTrigger=PropertyChanged}" Grid.Column="1" Grid.Row="0" 
Width="120" Height="30" HorizontalAlignment="Center" 
VerticalAlignment="Center"/> 
    <TextBox Name="tbRollnum" Text="{Binding CurrentStudent.RollNum}" 
Grid.Column="1" Grid.Row="1" Width="120" Height="30" 
HorizontalAlignment="Center" VerticalAlignment="Center"/> 
    <TextBox Name="tbSub" Text="{Binding CurrentStudent.Sub}" 
Grid.Column="1" Grid.Row="2" Width="120" Height="30" 
HorizontalAlignment="Center" VerticalAlignment="Center"/> 
    <TextBox Name="tbPh" Text="{Binding CurrentStudent.PhNum}" 
Grid.Column="1" Grid.Row="3" Width="120" Height="30" 
HorizontalAlignment="Center" VerticalAlignment="Center"/> 
    <Button Name="tbSubmit" Content="Submit" Grid.ColumnSpan="3" 
Grid.Row="4" Height="30" Width="100" HorizontalAlignment="Center"/> 
</Grid> 

</Window> 
+0

Können Sie Ausgabefenster in Visual Studio überprüfen beim Laufen und sehen, wenn Sie keine verbindlichen Ausnahmen bekommen? Es könnte sein, dass der aktuelle Student null ist –

Antwort

0

Meine Vermutung ist, dass Ihre Arbeit ist nicht bindend, weil Ihr _currentStudent standardmäßig null ist. Initialisiere deinen _currentStudent wenn null.

public student CurrentStudent 
    { 
     get { return _currentStudent = (_currentStudent ?? new student()); } 
     set 
     { 
      _currentStudent = value; OnPropertyChanged("CurrentStudent"); 
     } 
    } 
+0

es funktioniert perfekt Danke :) bin ich richtig mit MVVM Muster? Ich bin etwas verwirrt darüber, wo ich meine Abfragen für die Datenbankoperation schreiben werde. Im Moder oder Viewmodel? – Sumitk

+0

Von dem, was ich aus dem Code oben sehen kann, geht es Ihnen gut, aber um eine bessere Antwort zu geben, müsste ich die Struktur Ihres Projekts (s) sehen. Schau, du hast hier ein paar Optionen. Zum Beispiel können Sie einen DB-Kontext in Ihrem Modell haben, den Sie dann direkt von Ihrer VM abfragen ODER Sie können einen weiteren Layer hinzufügen und ein ähnliches Repository-Muster verwenden, um Ihre Abfragen zu bearbeiten, die Sie dann von Ihrer VM aus aufrufen können. Schau dir diese Frage an: http://stackoverflow.com/questions/1717621/mvvm-where-to-put-data-access-layer. Denken Sie daran, dies als die Antwort zu markieren, damit es auch anderen hoffentlich helfen kann. – Bracher

+0

danke Bracher für Ihre Antwort. Bitte teilen Sie Ihre E-Mail, damit ich meinen Demo-Code senden kann. Ich brauche einige Richtlinien, wenn Sie mir geben können, werde ich Ihnen dankbar sein. – Sumitk

0

Sie benötigen OnPropertyChanged in Ihrem Modell Klasse hinzuzufügen.

void OnPropertyChanged(string prop) 
     { 
      if (this.PropertyChanged != null) 
       this.PropertyChanged(this, new PropertyChangedEventArgs(prop)); 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
+0

in meiner Basisklasse schreibe ich dies. – Sumitk

-1

entfernen StartupUri = "YourXamlFile.xaml" von App.xaml

0

Wie pro Ihre obigen Code Sie den Wert auf CurrentStudent Property zugewiesen kippe so kann Sie bitte überprüfen Sie den Wert haben Eigenschaft CurrentStudent.

Vielen Dank für Ihre Frage

Verwandte Themen