2014-11-02 3 views
2

Я в настоящее время WebView в XAML, как показано здесьWebView Databinding только обновление раз

<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); 

     } 
    } 

На мой взгляд, я это исправить известную ошибку

/// <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. The GetBlank() работает и заполняет WebView правильно (я заполнил только с фиктивными данными для теста)
  3. ScreenFinished правильно работает и удаляет экран загрузки.
  4. НОМЕР: WebView не обновляет новый контент после его правильной передачи.

Может быть, я такой подход все неправильно, я не уверен, но тот факт, что ScreenLoading и ScreenFinished это все работает правильно, так как они изменяют связываемых свойства, которые правильно обновить на экране, я задаюсь вопросом, почему HtmlSource не делает то же самое.

+0

Также необходимо отметить, что свойство заголовка, которое также обновляется правильно, связывает и обновляет экран по завершении. Это означает, что это именно то, что связано с HtmlWebViewSource в WebView, возможно, только на Windows Phone, на данный момент не может протестировать его на Android, потому что мой пробный период истек и просто ждет оплаты счета, пока я не могу раскошелиться на бизнес-лицензию , –

ответ

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}; 

     }; 
    } 
Смежные вопросы