我有一些使用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。
你可以添加一些示例代碼? – Mike