2016-04-06 4 views
1

Извините, что, возможно, немой вопрос, я попытался найти что-то на эту тему, но ничего не получил.Реализовать filecounter с mvvm light

Итак, я получил приложение магазина Windows UWP, используя MVVM Light и SQLite.Net, который добавляет некоторые файлы в базу данных. Я хотел бы, чтобы следить за количеством файлов, добавленных в базу данных, поэтому я создал класс и статическое поле для него:

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(); 
     } 
    } 
} 

В Dataservice класса, который предоставляет методы для подключения к базе данных я использовал myCounter для подсчитать количество добавленных файлов, например:

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

(Следует также отметить, что эта часть работы - MyCounter действительно увеличивает) И, наконец, есть поле в MainViewModel называется CounterText, что переплетены в XAML:

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

Немой вопрос - как связать MyCounter с CounterText? Я попытался установить

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

в MainViewModel конструктору, но это не получать обновления. Должен ли я использовать Messenger для отправки CounterText некоторых уведомлений? Или я совершенно неправ, и есть более простой способ достичь моей цели? :)

ответ

0

В моей перспективе Не используйте модель только для счетчика. Вместо этого удалите ++ в Foreach, который будет запускать PropertyChanged в каждом цикле и использовать Count вне цикла.

CounterText = filelist.Count; 

CounterText должен быть изменен на SongCount TypeOf int и использовать IValueConverter при необходимости.

Удостоверьтесь, что ваш RaisePropertyChanged(); сработал правильно, arent, вы должны это сделать ???

RaisePropertyChanged("CounterText"); 
+0

К сожалению, я не могу использовать 'fileList.Count()', потому что я хотел бы показать прогресс. Например, если у меня есть 5000 объектов для вставки в базу данных, я хотел бы посмотреть, сколько файлов фактически добавлено, чтобы понять, сколько их осталось.Что касается 'RaisePropertyChanged'' CounterText' - это просто не срабатывает с моей старой конструкцией. Я постараюсь использовать ваши и посмотреть, что произойдет :) –

0

Ну, после некоторого времени я, наконец, сумел решить проблему и решил опубликовать ответ для тех, кто интересуется.
На самом деле, я пришел к мысли, что оригинальный механизм не работает, потому что не было привязки. Исправьте меня, если я ошибаюсь, но я думаю, что событие RaisePropertyChanged() влияет только на пользовательский интерфейс, привязанный к свойству tj.
В любом случае, я решил использовать класс Messenger, предоставленный MVVM Light, и избавиться от Counter класса. Таким образом, в Dataservice классе есть:

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")); 
     } 
    } 
} 

И в конструкторе MainViewModel:

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); 
    } 
} 

Может быть, это не самое элегантное решение, но, по крайней мере, это работает. Во всяком случае, я все еще открыт для чего-то другого.