Xamarin Forms IOS的​​绑定问题和OnAppearing问题

时间:2017-05-06 02:24:06

标签: xamarin.ios xamarin.forms

我在使用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没有。

1 个答案:

答案 0 :(得分:0)

我想出了这个。我通过显示标签和隐藏列表视图来处理绑定的方式反之亦然,这干扰了IOS处理请求的方式。我删除了绑定并使用列表视图上的属性更改处理程序直接设置控件。这修复了标签,后退按钮等出现的问题。