我有一个 MVVM 应用程序,我的 ViewModelPingerViewModel
处理传入的 WCFPing()
消息。处理此类消息发生在Scheduler.Default
's 线程池的线程上。从语义上讲,传入的 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();
}
我的视图模型的一部分
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; }
//...
}