プログラムの起動時に読み込みプロセスを表示するスプラッシュ スクリーンがあります。コンポーネントが読み込まれると、ラベルのテキストを更新することができません。
メインのスタートアップ program.cs から、スプラッシュ スクリーン コントローラーで run() メソッドを呼び出します。
startUpSplash.Run();
こちらがコントローラー。これは、「初期化中...」というラベルが付いたスプラッシュ スクリーンを示しています。
public class StartUpSplashController
{
public StartUpSplashViewModel ViewModel { get; set; }
private StartUpSplashView starUpSplashWindow = new StartUpSplashView();
private delegate void UIDelegate();
public void Run()
{
InitializeViewModel();
ViewModel.StatusMessage = "Initializing...";
starUpSplashWindow.DataContext = ViewModel;
starUpSplashWindow.Show();
}
public void UpdateStatus(string statusMessage)
{
starUpSplashWindow.Dispatcher.Invoke(new UIDelegate(delegate { ViewModel.StatusMessage = statusMessage; }));
//ViewModel.StatusMessage = statusMessage;
}
public void End()
{
starUpSplashWindow.Close();
starUpSplashWindow.InvalidateVisual();
}
private void InitializeViewModel()
{
ViewModel = new StartUpSplashViewModel(starUpSplashWindow);
ViewModel.Controller = this;
}
}
次に、メインの program.cs から、さまざまなことが起こっているときに、スプラッシュ コントローラーでもこの UpdateStatus メソッドを呼び出します。これは、ラベルを更新して、起こっているさまざまなことをすべて表示することを目的としています。
これは、更新されるはずの lbl の Xaml です。
<Label Content="{Binding Path=StatusMessage, Mode=TwoWay, UpdateSourceTrigger= PropertyChanged}" />
UpdateStatus メソッドが呼び出されたときに、ラベルが更新されていません。私が気づいた奇妙なことの1つは、
startupSplash.UpdateStatus("something");
その後
Messagebox.show("something");
メッセージボックスがポップアップした後、スプラッシュ画面に更新されたラベルが表示されます。
これについての助けをいただければ幸いです。
更新 2: ビュー モデルは次のとおりです。
public class StartUpSplashViewModel : ViewModel<IView>
{
[ImportingConstructor]
public StartUpSplashViewModel(StartUpSplashView view)
: base(view)
{
}
public StartUpSplashController Controller { get; set; }
private string _statusMessage;
public string StatusMessage
{
get
{
return _statusMessage;
}
set
{
if (_statusMessage == value)
return;
_statusMessage = value;
this.RaisePropertyChanged(s => s.StatusMessage);
}
}
}