2017-05-06 96 views
1

我有一些使用xamarin形式IOS綁定的問題。 我有綁定當第一頁出現時,在屏幕中央顯示一個加載標籤。綁定問題和OnAppearing問題與Xamarin形式IOS

在listview加載數據後,通過綁定隱藏加載標籤,並顯示列表視圖。

在Android項目中,我有這個回購Xamarin forms IOS Android Test

它工作正常。在repro項目中的ios中,加載標籤在應用程序第一次加載時隱藏,如果點擊屏幕將顯示。 如果你繼續加載標籤消失,你會看到一個空白屏幕,但如果你再次點擊屏幕上出現列表數據視圖。

我在想這是一個xamarin錯誤,但我希望我的綁定不正確。我爲這個問題工作,將不勝感激。 我還有兩個其他問題。當您單擊列表視圖項並導航時,數據不會刷新,因爲未出現未觸發。

在android中,它被觸發時沒有問題。有時在你像上面提到的步驟一樣點擊屏幕之後觸發。 最後一個問題是,當在標籤之間切換時,IOS不會在出現時觸發。它使用android。 在這個問題上的任何幫助將不勝感激。我已經對這些問題的解決方案進行了廣泛的搜索,但尚未找到答案。 謝謝!

下面是一些代碼片段的幫助。如果您想對其進行測試,此代碼也位於GitHub倉庫中。

在XAML

<Label x:Name="xEmptyListView" 
     FontSize="16" 
     HorizontalOptions="CenterAndExpand" 
     HorizontalTextAlignment="Center" 
     VerticalOptions="CenterAndExpand"    
     Text="{Binding ListViewVisibleText, Mode=TwoWay}" 
     IsVisible="{Binding IsListViewLabelEmptyVisible, Mode=TwoWay }"/> 

    <ListView x:Name="ItemsListView" 
      ItemsSource="{Binding Items}" 
      VerticalOptions="FillAndExpand" 
      HasUnevenRows="true" 
      RefreshCommand="{Binding LoadItemsCommand}" 
      IsPullToRefreshEnabled="true" 
      IsRefreshing="{Binding IsBusy, Mode=OneWay}" 
      CachingStrategy="RecycleElement" 
      ItemSelected="OnItemSelected" 
      IsVisible="{Binding IsListViewVisible, Mode=TwoWay}" 
      IsEnabled="{Binding IsActivityRunning, Mode=TwoWay, Converter={StaticResource InverseBooleanConverter}}"> 

視圖模型

private bool activityRunning { get; set; } 

    public bool IsActivityRunning 
    { 
     get { return activityRunning; } 
     set 
     { 
      if (activityRunning == value) 
       return; 

      activityRunning = value; 
      OnPropertyChanged("IsActivityRunning"); 
     } 
    } 

    private string listViewVisibleText { get; set; } 
    public string ListViewVisibleText 
    { 
     get { return listViewVisibleText; } 
     set 
     { 
      if (listViewVisibleText == value) 
       return; 

      listViewVisibleText = value; 
      OnPropertyChanged("ListViewVisibleText"); 
     } 
    } 



    private bool listViewLabelEmptyVisible { get; set; } 

    public bool IsListViewLabelEmptyVisible 
    { 
     get 
     { 
      if (Items == null || Items.Count == 0) 
      { 
       if (IsBusy) 
       { 
        ListViewVisibleText = "Loading..."; 
       } 
       else 
       { 

        ListViewVisibleText = "No Items found"; 


       } 
       listViewLabelEmptyVisible = true; 
      } 
      else 
      { 
       ListViewVisibleText = string.Empty; 
       listViewLabelEmptyVisible = false; 
      } 

      OnPropertyChanged("IsListViewLabelEmptyVisible"); 
      return listViewLabelEmptyVisible; 
     } 
    } 

    private bool listViewVisible { get; set; } 

    public bool IsListViewVisible 
    { 
     get 
     { 
      if (Items == null || Items.Count == 0) 
      { 
       listViewVisible = false; 
      } 
      else 
      { 
       listViewVisible = true; 
      } 

      OnPropertyChanged("IsListViewVisible"); 
      return listViewVisible; 
     } 
    } 

XAML.cs

protected override void OnAppearing() 
     { 
      base.OnAppearing(); 


       viewModel.LoadItemsCommand.Execute(null); 
     } 

我使用的通知屬性更改。這是標準的代碼

這是我的視圖模型繼承了notifyproperty改變

public class ItemsViewModel : BaseViewModel 

當你創建一個測試xamarin項目,這是該基地視圖模型從可觀察對象

public class BaseViewModel : ObservableObject 

繼承它看起來的樣子。

public class ObservableObject : INotifyPropertyChanged 
    { 
     /// <summary> 
     /// Sets the property. 
     /// </summary> 
     /// <returns><c>true</c>, if property was set, <c>false</c> otherwise.</returns> 
     /// <param name="backingStore">Backing store.</param> 
     /// <param name="value">Value.</param> 
     /// <param name="propertyName">Property name.</param> 
     /// <param name="onChanged">On changed.</param> 
     /// <typeparam name="T">The 1st type parameter.</typeparam> 
     protected bool SetProperty<T>(
      ref T backingStore, T value, 
      [CallerMemberName]string propertyName = "", 
      Action onChanged = null) 
     { 
      if (EqualityComparer<T>.Default.Equals(backingStore, value)) 
       return false; 

      backingStore = value; 
      onChanged?.Invoke(); 
      OnPropertyChanged(propertyName); 
      return true; 
     } 

     /// <summary> 
     /// Occurs when property changed. 
     /// </summary> 
     public event PropertyChangedEventHandler PropertyChanged; 

     /// <summary> 
     /// Raises the property changed event. 
     /// </summary> 
     /// <param name="propertyName">Property name.</param> 
     protected void OnPropertyChanged([CallerMemberName]string propertyName = "") 
     { 
      var changed = PropertyChanged; 
      if (changed == null) 
       return; 

      changed.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

活動運行時得到的物品加載等 這對Android的所有作品集。它沒有IOS。

+0

你可以添加一些示例代碼? – Mike

回答

0

我想出了這一個。我通過顯示標籤和隱藏列表視圖來處理綁定的方式,反過來干擾了IOS處理請求的方式。我刪除了綁定,並使用列表視圖上的屬性更改處理程序直接設置控件。這固定在標籤,後退按鈕等出現的問題。