2017-04-13 43 views
-1

我最初有一个异步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更新”。

当我有完整的异步模式,我认为这是一个线程问题,但现在很明显,它是更简单。

回答

1

我不认为你已经给了UI足够的时间来注册它的处理程序。快速解决就是让步。试试这个:

protected override async void OnNavigatedTo(NavigationEventArgs e) 
{ 
    // This forces the rest of your code to enqueue after UI is done. 
    await Task.Yield(); 

    viewModel.populate(); 
} 

UPDATE

的绑定将不会激活,直到你的网页是在视觉树。他们可能会首先检索价值,也可能不会先检索价值,但他们稍后会订阅PropertyChanged

如果要确保所有绑定都已到位,请不要订阅OnNavigatedTo,而应使用Loaded

public partial class VPage : Page 
{ 
    public ViewModel viewModel; 

    public VPage() 
    { 
     DataContext = viewModel = new ViewModel(); 
     InitializeComponent(); 

     Loaded += OnLoaded; 
    } 

    private void OnLoaded(object sender, RoutedEventArgs e) 
    { 
     viewModel.onNavigatedTo(); 
    } 

    private void onTap(object sender, TappedRoutedEventArgs eventArgs) { viewModel.onTap(); } 
} 
+0

感谢这 - 我在两个地方[OnNavigatedTo()和onComplete()]尝试过,但没有喜悦。同样的行为。尽管如此,我同意你的年龄诊断。在用户界面完成设置之前,我会回来。 – jbhelicon

+0

另一个想法:我不相信这是一个竞争条件 - 获取文本的模型线程进行远程数据访问,这需要相对永恒。某处似乎被阻塞了。 – jbhelicon

+0

编辑问题以在评论后添加更多数据;您的评论仍然相关,并赞赏。 – jbhelicon