MVVM パターンに基づいて WP7 アプリケーションを作成しようとしていますが、TextBlock のバインド コンテンツの更新に問題があります。現在の状態では、ページを再度開いてコンテンツを更新する必要があります。データコンテキストの設定に関係していると思いますが、修正できませんでした。
ViewModel.cs の PropertyChangedEventHandler
public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName)
{
if (null != PropertyChanged)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
private string _txtStatus = "";
public string TxtStatus
{
get { return _txtStatus; }
set
{
_txtStatus = value;
NotifyPropertyChanged("TxtStatus");
}
}
App.xaml.cs の ViewModel プロパティ
public partial class App : Application
{
private static ViewModel _viewModel { get; set; }
public static ViewModel ViewModel
{
get { return _viewModel ?? (_viewModel = new ViewModel()); }
}
StatusPage.xaml.cs での DataContext の設定
public partial class Status : PhoneApplicationPage
{
public Status()
{
InitializeComponent();
DataContext = App.ViewModel;
}
StatusPage.xaml でのバインド
<TextBlock x:Name="TxtStatus" Text="{Binding Path=TxtStatus, Mode=OneWay}" Width="450" TextWrapping="Wrap" HorizontalAlignment="Left" VerticalAlignment="Top" />
更新 1
MqttService.cs の TxtStatus の設定値
public class MqttService
{
private readonly ViewModel _viewModel;
public MqttService(ViewModel viewModel)
{
_viewModel = viewModel;
}
private void Log(string log)
{
_viewModel.TxtStatus = _viewModel.TxtStatus + log;
}
private void Connect()
{
_client.Connect(true);
Log(MsgConnected + _viewModel.TxtBrokerUrl + ", " + _viewModel.TxtClientId + "\n");
_viewModel.IsConnected = true;
}
ViewModel.cs の MqttService プロパティ
private MqttService _mqttService;
public MqttService MqttService
{
get { return _mqttService ?? (_mqttService = new MqttService(this)); }
}
ここで、循環参照の問題 (MqttService-ViewModel) のようなものがあるのではないかと思います。よくわかりませんが、私には良さそうです。