我在使用xamarin表单IOS进行绑定时遇到了一些问题。 我有绑定当第一页出现时,在屏幕中央显示一个加载标签。
在listview加载数据后,通过绑定隐藏加载标签,并显示列表视图。
在我的repo Xamarin forms IOS Android Test
中的android项目中工作正常。在repro项目的ios中,加载标签在应用程序首次加载时隐藏,如果您点击屏幕则会显示。 如果继续,加载标签消失,您看到一个空白屏幕,但如果再次点击屏幕,则会显示列表数据视图。
我认为这是xamarin的一个错误,但我希望我的绑定只是不正确。我将努力解决这个问题。 我还有另外两个问题。当您单击列表视图项并导航回来时,数据不会刷新,因为不会触发正在显示的数据。
在android中它被触发没有问题。有时在您点击屏幕后触发按钮,就像上面提到的步骤一样。 最后一个问题是当在标签之间切换时IOS不会在出现时触发。有了它,它确实。 任何有关这个问题的帮助将不胜感激。我已经对这些问题的解决方案进行了广泛的搜索,但还没有找到并回答。 谢谢!
以下是一些有用的代码段。如果你想测试它,这段代码也在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);
}
我正在使用notify属性更改。这是标准代码
这是我的视图模型继承的notifyproperty已更改
public class ItemsViewModel : BaseViewModel
哪个基本视图模型继承自可观察对象
public class BaseViewModel : ObservableObject
当您创建测试xamarin项目时,这就是它的外观。
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 :(得分:0)
我想出了这个。我通过显示标签和隐藏列表视图来处理绑定的方式反之亦然,这干扰了IOS处理请求的方式。我删除了绑定并使用列表视图上的属性更改处理程序直接设置控件。这修复了标签,后退按钮等出现的问题。