我最初有一个异步MVVM模式;在调试我已经剥离,现在下降到只有以下 - 同步 - 代码:PropertyChangedEventHandler准备工作
XAML:
<Grid x:Name="LayoutRoot">
<Button x:Name="button" Content="{Binding Path=bText, FallbackValue=Initial}" Tapped="onTap"/>
</Grid>
C#
public partial class VPage : Page
{
public ViewModel viewModel;
public VPage()
{
DataContext = viewModel = new ViewModel();
InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e) { viewModel.onNavigatedTo(); }
private void onTap(object sender, TappedRoutedEventArgs eventArgs) { viewModel.onTap(); }
}
public class viewModel : INotifyPropertyChanged
{
private String _bText;
public String bText { get { return _bText; } set { _bText = value; DB.major("ViewModel: bText=" + _bText); NotifyPropertyChanged("bText"); } }
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged == null)
writeln("Null handler!");
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
}
public void onNavigatedTo() { bText = "Updated via onNavigatedTo"; }
private int count = 0;
public void onTap() { bText = "Updated via onTap " + count++.ToString(); }
}
那现在就是整个代码库 - 我已经消除所有的模型和异步代码来帮助调试。
启动时,页面构造函数运行并完成。
随后,VPage.OnNavigatedTo被调用,并调用ViewModel.onNavigatedTo();
在对OnNavigatedTo的调用中,writeln触发器指示处理程序为空,表明组件初始化未以某种方式完成。随后 - 即onTap - 一切正常,处理程序已到位。有趣的是,即使null处理器写入触发,该字段也会更新为“通过onNavigatedTo更新”。
当我有完整的异步模式,我认为这是一个线程问题,但现在很明显,它是更简单。
感谢这 - 我在两个地方[OnNavigatedTo()和onComplete()]尝试过,但没有喜悦。同样的行为。尽管如此,我同意你的年龄诊断。在用户界面完成设置之前,我会回来。 – jbhelicon
另一个想法:我不相信这是一个竞争条件 - 获取文本的模型线程进行远程数据访问,这需要相对永恒。某处似乎被阻塞了。 – jbhelicon
编辑问题以在评论后添加更多数据;您的评论仍然相关,并赞赏。 – jbhelicon