2016-04-04 9 views
0

Ich denke, mein Problem zu aktualisieren hat etwas mit der Datenbindung zu tun:Textblock ui nicht mvvm C#

My.xaml Zugabe von Viewmodel:

<Grid.Resources> 
      <vm:FreeTrainingViewModel x:Key="FreeTrainingViewModel"></vm:FreeTrainingViewModel> 
     </Grid.Resources> 

Mein .xaml Textblock:

<TextBlock FontFamily="Segoe WP Black" FontSize="300" HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding PushupsCount, Source={StaticResource FreeTrainingViewModel}}" ></TextBlock> 

Mein Viewmodel:

public class FreeTrainingViewModel:INotifyPropertyChanged 
{ 
    private int _pushupsCount; 

    public int PushupsCount 
    { 
     get { return _pushupsCount; } 
     set { _pushupsCount = value; OnPropertyChanged("_pushupsCount"); Debug.WriteLine("Triggered PropertyChanged"); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

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

-Code hinter meiner Sicht:

public sealed partial class FreeTraining : Page 
    { 
     FreeTrainingViewModel FreeTrainingViewModel = new FreeTrainingViewModel(); 
     public FreeTraining() 
     {    
      this.InitializeComponent(); 
     } //Method for adding +1 to the pushupsCount "FreeTrainingViewModel.PushupsCount+1;" 
} 

Die PropertyChangedEvent ausgelöst zu werden, die Eigenschaft verändert mich in Ordnung, aber der Textblock wird nicht aktualisiert.

Ich weiß nicht, was falsch ist. Hilf mir den Fehler zu finden.

+0

Try Einstellung, Mode = TwoWay – Sajeetharan

+0

Versuchen Update Eigenschaft festlegen in xaml wie folgt: 'Text =" {Binding ..., UpdateSourceTrigger = PropertyChanged} "' – Redouane

+0

@Sajeetharan Es funktioniert nicht –

Antwort

2

Es gibt zwei Probleme auf Ihrem Code:

  1. Sie müssen die OnPropertyChanged mit Eigenschaftsnamen ("PushupsCount") anstelle von Ihren privaten Mitglied Namen nennen ("_pushupsCount")

  2. Sie erstellen 2 Instanzen von FreeTrainingViewModel:

    • Eins in den Grid-Ressourcen. Dieser ist bindend mit dem TextBlock
    • One in FreeTraining. Sie versuchen, dies zu aktualisieren. Sie müssen die gleiche Instanz an 2 Stellen verwenden.

In Ihrer XAML-Datei:

<Grid x:Name="gridName"> 
    <Grid.Resources> 
     <vm:FreeTrainingViewModel x:Key="FreeTrainingViewModel"></vm:FreeTrainingViewModel> 
    </Grid.Resources> 
</Grid> 

In Ihrem Code hinter:

public sealed partial class FreeTraining : Page 
{ 
    FreeTrainingViewModel FreeTrainingViewModel; 
    public FreeTraining() 
    {    
     this.InitializeComponent(); 
     FreeTrainingViewModel = (FreeTrainingViewModel)gridName.FindResource("FreeTrainingViewModel"); 
    } //Method for adding +1 to the pushupsCount "FreeTrainingViewModel.PushupsCount+1;" 

}

+0

Sind Sie sicher? funktioniert immer noch nicht –

+0

Ich habe das Viewmodel zu den page.resources hinzugefügt, ich entwickle eine universelle Windows-App, also gibt es keine findresource-Methode - ich verstehe jetzt, dass ich 2 Instanzen des FreeTrainingViewModel erstellt habe, also habe ich das c gelöscht. code hinter der Seite, kann ich nicht auf das Viewmodel zugreifen, indem ich den Schlüssel in C# verwende? Wie FreeTrainingsViewmodel.Property = ... –

+0

Ich habe nicht mit Universal-App gearbeitet. Aber ich glaube, Sie können die Ressourceninstanz in Ihrem Code wie folgt erhalten: gridName.Resources ["FreeTrainingViewModel"]. https://msdn.microsoft.com/en-us/windows/uwp/controls-and-patterns/resourcedictionary-and-xaml-resource-references –

Verwandte Themen