2016-04-06 12 views
1

Sorry für vielleicht dumme Frage, ich habe versucht, etwas zu diesem Thema zu finden, aber hatte nichts im Ergebnis.Dateicounter mit mvvm Licht implementieren

Also habe ich die UWP Windows Store App mit MVVM Light und SQLite.Net, die einige Dateien in der Datenbank hinzugefügt. Ich möchte den Überblick über Anzahl der Dateien zur Datenbank hinzugefügt halten, also habe ich eine Klasse und statische Feld für sie erstellt:

public class Vars : ObservableObject 
{ 
    public static Counter MyCounter = new Counter() { SongCounter = 0 }; 
} 

public class Counter : ObservableObject 
{ 
    private int songCounter; 
    public int SongCounter 
    { 
     get { return songCounter; } 
     set 
     { 
      songCounter = value; 
      RaisePropertyChanged(); 
     } 
    } 
} 

In der Dataservice Klasse, die ich myCounter verwendeten Methoden für die Datenbankverbindung bereitstellt zählen die Anzahl der hinzugefügten Dateien, wie folgt aus:

public class Dataservice 
{ 
    public static void RebuildLibrary() 
    { 
     //getting fileList 
     foreach(var file in fileList) 
     { 
      //doing some stuff here 
      Vars.MyCounter.SongCounter++ 
     } 
    } 
} 

(sollte auch beachten, dass dieser Teil funktioniert - MyCounter wirklich erhöht) Und schließlich das Feld in der CounterText genannt MainViewModel es, die XAML binded ist:

private string counterText; 
public string CounterText 
{ 
     get { return counterText; } 
     set 
     { 
      counterText = value; 
      RaisePropertyChanged(); 
     } 
} 

Die dumme Frage ist - wie MyCounter mit CounterText zu binden? Ich habe versucht,

CounterText = Vars.MyCounter.SongCounter.ToString(); 

im MainViewModel Konstruktor gesetzt, aber es ist nicht immer aktualisiert. Sollte ich Messenger verwenden, um CounterText einige Benachrichtigungen zu senden? Oder liege ich völlig falsch und es gibt einen einfacheren Weg, um mein Ziel zu erreichen? :)

Antwort

0

In meiner Perspektive, Verwenden Sie kein Modell für nur einen Zähler. Entfernen Sie stattdessen ++ in Foreach, das PropertyChanged in jeder Schleife auslöst, und verwenden Sie Count außerhalb der Schleife.

CounterText = filelist.Count; 

CounterText sollte IValueConverter zu SongCount typeof int und verwenden bei Bedarf geändert werden.

Stellen Sie sicher, dass Ihre RaisePropertyChanged(); korrekt ausgelöst wird, sollst du das tun ???

+0

Leider kann ich 'fileList.Count()' nicht verwenden, weil ich den Fortschritt anzeigen möchte. Wenn ich beispielsweise 5000 Objekte in die Datenbank einfügen möchte, würde ich gerne sehen, wie viele Dateien tatsächlich hinzugefügt werden, um zu verstehen, wie viele noch übrig sind.Wie für die 'RaisePropertyChanged' von' CounterText' - es ist einfach nicht mit meiner alten Konstruktion Feuer. Ich werde versuchen, deins zu benutzen und zu sehen, was passiert :) –

0

Nun, nachdem ich für eine Weile gekämpft habe, habe ich es endlich geschafft, das Problem zu lösen und habe beschlossen, eine Antwort für diejenigen zu schreiben, die Interesse haben.
Eigentlich kam ich zu dem Gedanken, dass der ursprüngliche Mechanismus nicht funktionierte, weil es nicht die Bindung gab. Korrigieren Sie mich, wenn ich falsch liege, aber ich denke, dass das Ereignis RaisePropertyChanged() nur die Benutzeroberfläche betrifft, die an die Eigenschaft gebunden ist.
Wie auch immer, ich entschied mich, Messenger Klasse von MVVM Light zur Verfügung gestellt und loszuwerden Counter Klasse. So in der Dataservice Klasse gibt es:

public class Dataservice 
{ 
    public static void RebuildLibrary() 
    { 
     string counter = "Files added: 0"; 
     int i; 
     //getting fileList 
     foreach (var file in fileList) 
     { 
      //doing some stuff here 
      i++; 
      counter = $"Files added: {i}"; 
      Messenger.Default.Send(new NotificationMessage<string>(counter, "Counter")); 
     } 
    } 
} 

Und im MainViewModel Konstruktor:

public class MainViewModel : ViewModelBase 
{ 
    private string counterText; 
    public string CounterText 
    { 
     get {return counterText; } 
     set 
     { 
      counterText = value; 
      RaisePropertyChanged(); 
     } 
    } 

    public MainViewModel() 
    { 
     Messenger.Default.Register<NotificationMessage<string>>(this, (m) => CounterText = m.Content); 
    } 
} 

Vielleicht ist es nicht die eleganteste Lösung, aber zumindest funktioniert es. Jedenfalls bin ich immer noch offen für etwas anderes.

Verwandte Themen