初めまして、質問が長くなってしまい申し訳ありません。
現在複数の XML ファイルにデータを格納している Silverlight for Windows Phone 7 アプリを更新しています。CompactSQL DB を使用するようにアプリを更新しています。新しいバージョンをインストールした後、最初の実行時に XML ファイルから DB にデータを移行する必要があります。
各ファイルが DB に移行されるときの進行状況をユーザーに示す進行状況バー (IsIndeterminate=false) が必要です (操作には最大 2 分かかる場合があるため)。
問題は、NotifyProperyChanged イベントが発生し、バーの値が正しく更新されているにもかかわらず、プログレスバーが画面上で更新されない (または表示されない) ことです。XAML で値を設定すると、問題なく表示されます (静的ですが、少なくとも画面に描画されます)。
プログレスバーがデバイスにまったく表示されない理由がわかりません。
私の INotifyChanged セットアップ
private int migrateCount;
public int MigrateCount //Prop used for ProgressBar.Value
{
get
{
return this.migrateCount;
}
set
{
this.migrateCount = value;
NotifyPropertyChanged("MigrateCount");
}
}
public int MigrateTotal { get; set; } //Prop used for ProgressBar.Maximum
public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
void MainPage_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "MigrateCount")
{
ProBar.Maximum = MigrateTotal; //ProBar is the name of my ProgressBar
ProBar.Value = MigrateCount;
}
}
public event PropertyChangedEventHandler PropertyChanged;
public MainPage()
{
this.PropertyChanged += new PropertyChangedEventHandler(MainPage_PropertyChanged);
...
}
読み込みに時間がかかりすぎるアプリは OS によって終了されるため、OnNavigatedTo ではなく Loaded で MigrateDB メソッドを呼び出します。
private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
{
using (var store = IsolatedStorageFile.GetUserStoreForApplication())
{
string[] dirs = store.GetDirectoryNames();
if (dirs.Length > 1) //Checks to see if there's any data to migrate
{
MigrateDB();
LoadData(); //Loads data from the DB once it's populated
}
}
この操作には何年もかかります。1 分あたり約 100 個の XML ファイルであり、ユーザーは 30 ~ 300 個のファイルを持つと予想されます。
private void MigrateDB()
{
string[] DirList;
using (var store = IsolatedStorageFile.GetUserStoreForApplication())
{
DirList = store.GetDirectoryNames("*");
MigrateTotal = DirList.Length - 1; // -1 to account for the "Shared" Dir
foreach(...)
{
... Does lots of IsoStore operations / XML serialising and DB updating
MigrateCount++;
}
}
...
}