ViewModel がPingerViewModel
着信 WCFPing()
メッセージを処理する MVVM アプリがあります。このようなメッセージの処理は、Scheduler.Default
のスレッド プールのスレッドで行われます。意味的には、着信 WCF メッセージはバインドされたプロパティCanPing
を変更し、そのプロパティの PropertyChanged イベントを発生させます。
しかし、 UI イベント (ウィンドウのフォーカス/クリックなど) を受信するまでUI は更新されません。
イベントが発生するとすぐに更新するにはどうすればよいですか?
PropertyChanged イベントを発生させようとしました...
- アプリケーションのディスパッチャーで、
- SynchronizationContext の使用
運がなければ。
また、バインドされたプロパティが実際に適切な値に設定されていること、および PropertyChanged イベントを消費するリスナーが実際に存在することも確認しました。
ここにいくつかのコードがあります (完全なコードは github にあります):
私のビューの MainWindow.xaml の一部:
バウンドCommand
は実際には着信 WCF メッセージの生成に関与しないことに注意してください。
<Button Content="Ping" Height="23" HorizontalAlignment="Left" Margin="10,10,0,0" Name="PingBtn" VerticalAlignment="Top" Width="75" AutomationProperties.AutomationId="Ping"
IsEnabled="{Binding CanPing}"
Command="{Binding PingCommand}" />
ビューの一部 MainWindow.xaml.cs
public MainWindow()
{
DataContext = new PingerViewModel();
InitializeComponent();
}
私のViewModelの一部
public class PingerViewModel : INotifyPropertyChanged
public PingerViewModel()
{
Pinger = new Pinger(true);
PingCommand = new PingerPingCommand(this);
//...
}
public bool CanPing
{
get
{
if (Pinger == null) return false;
return Pinger.CanPing;
}
}
public void Ping()
{
_pingClient.Channel.Ping();
Pinger.CanPing = false;
OnPropertyChanged("CanPing");
}
protected virtual void OnPong(PongEventArgs e)
{
Pinger.CanPing = true;
OnPropertyChanged("CanPing");
}
public Pinger Pinger { get; private set; }
public ICommand PingCommand { get; private set; }
//...
}