2014-11-02 43 views
2

我目前在XAML網頁視圖這裏的WebView數據綁定只更新一次

<StackLayout> 
    <WebView x:Name="PrimaryWebView" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand"> 
    <WebView.Source> 
     <HtmlWebViewSource Html="{Binding Path=ViewModel.HtmlSource}" /> 
    </WebView.Source> 
    </WebView>  
</StackLayout> 

顯示在我的ViewModel我有

private String htmlSource = null; 
    public String HtmlSource 
    { 
     get 
     { 

      if (String.IsNullOrEmpty(htmlSource)) 
      { 

       Device.BeginInvokeOnMainThread(async() => 
       { 
        ScreenLoading(); 

        var result = await contentController.Get(currentPage); 
        if (result != null) 
        { 

         HtmlSource = result.Content; 
         Heading = result.Name; 

        } 

        ScreenFinished(); 

       }); 

       // Returns empty while loading 
       return contentController.GetBlank(); 
      } 

      // returns here once htmlSource is no longer empty 
      return htmlSource; 

     } 
     set 
     { 
      htmlSource = value; 
      RaisePropertyChanged(() => HtmlSource); 

     } 
    } 

在我看來,我有這個來修復已知的bug

/// <summary> 
    /// FIX: Due to bug https://bugzilla.xamarin.com/show_bug.cgi?id=21699 
    /// </summary> 
    protected override void OnBindingContextChanged() 
    { 
     base.OnBindingContextChanged(); 

     PrimaryWebView.Source.BindingContext = BindingContext; 
    } 

第一頁加載

  1. 我ScreenLoading的工作原理是顯示加載屏幕
  2. 的GetBlank()的作品,並正確填寫web視圖(我曾經使用過虛擬數據填補了這一測試)
  3. ScreenFinished正常運行,並刪除加載屏幕。
  4. 問題:一旦正確返回,WebView不會隨新內容一起更新。

也許我這種做法都是錯誤的,我不知道,但事實ScreenLoading和ScreenFinished是所有工作正常,因爲他們改變了綁定屬性:屏幕上正確地更新,我想知道爲什麼HtmlSource不一樣。

+0

另請注意,也正確更新的Heading屬性在完成時綁定並更新屏幕。這意味着它可能與WebView上的HtmlWebViewSource有關,可能只是在Windows Phone上,目前無法在Android上進行測試,因爲我的試用期已過期,只需等待發票付款,直到我可以爲營業執照。 – 2014-11-02 06:01:04

回答

1

我找到了一種方法讓它更新,但我不喜歡它。我更新了OnBindingContextChanged以檢測屬性何時更改,然後將其重新綁定到新源。它的工作原理,但如果任何人有更好的方式或爲什麼這首先發生,請讓我知道。

/// <summary> 
/// FIX: Due to bug https://bugzilla.xamarin.com/show_bug.cgi?id=21699 
/// </summary> 
protected override void OnBindingContextChanged() 
{ 
    base.OnBindingContextChanged(); 

    PrimaryWebView.Source.BindingContext = BindingContext; 
    PrimaryWebView.Source.PropertyChanged += (sender, e) => 
    { 

      PrimaryWebView.Source = new HtmlWebViewSource() { BindingContext = BindingContext, Html = ((PolicyViewModel)BindingContext).HtmlSource}; 

     }; 
    }