StackLayout可见性在ListView中的Property Change上没有改变

时间:2018-03-15 11:37:43

标签: xaml xamarin.forms

我有一个分组ObservableCollection,绑定到ListView

我在StackLayout内的ListView内有一些PropertyChange,其可见性在ListView tapp上发生了变化。

内部的所有其他属性都对StackLayout做出反应,但UI Thread的可见性却没有。

所有这些都是在Device.BeginInvokeOnMainThread(() => { item.Effort = SelectedTaskItem.Effort; finalEffortDouble = SelectedTaskItem.Effort + finalEffortDouble - previousEffort; item.IsSaved = true; item.IsNotSaved = false; item.EffortsString = SelectedTime.ToString("hh':'mm") + " h"; TotalEffortsHoursString = TimeSpan.FromHours(finalEffortDouble + TotalEffortsHours).ToString("hh'.'mm") + " hrs"; }); 上完成的。

其他人是否有此问题?

在循环中更新UI

IsSaved

IsNotSavedboolStackLayout,绑定到ListView内的 <StackLayout Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" IsVisible="{Binding IsNotSaved,Mode=TwoWay}" Padding="0" Margin="0" HorizontalOptions="FillAndExpand"> <Label Text="{Binding TaskName}" FontAttributes="Bold" FontSize="16" LineBreakMode="TailTruncation" /> <Label Text="Enter time spent on this task daily" FontSize="12" /> </StackLayout> <StackLayout Grid.Row="0" Grid.Column="1" IsVisible="{Binding IsNotSaved,Mode=TwoWay}" Orientation="Horizontal" VerticalOptions="CenterAndExpand" Spacing="10" HorizontalOptions="End" Padding="0" Margin="0"> <ffimageloading:CachedImage Source="tsplus"> <ffimageloading:CachedImage.GestureRecognizers> <TapGestureRecognizer Tapped="EditTime_Tapped" CommandParameter="{Binding .}" /> </ffimageloading:CachedImage.GestureRecognizers> </ffimageloading:CachedImage> </StackLayout> <StackLayout x:Name="Is1" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" IsVisible="{Binding IsSaved,Mode=TwoWay}" Padding="0" Margin="0" HorizontalOptions="FillAndExpand"> <Label Text="{Binding TaskName}" FontAttributes="Bold" FontSize="16" LineBreakMode="TailTruncation" /> <StackLayout Orientation="Horizontal" Padding="0" Margin="0" HorizontalOptions="FillAndExpand"> <Label Text="Tap on time to edit" FontSize="12" /> <ffimageloading:CachedImage Source="savedtag" WidthRequest="60" HeightRequest="20" /> </StackLayout> </StackLayout> <StackLayout x:Name="Is2" Grid.Row="0" Grid.Column="1" IsVisible="{Binding IsSaved,Mode=TwoWay}" VerticalOptions="CenterAndExpand" HorizontalOptions="End" Padding="0" Margin="0"> <StackLayout.GestureRecognizers> <TapGestureRecognizer Tapped="EditTime_Tapped" CommandParameter="{Binding .}" /> </StackLayout.GestureRecognizers> <Label Text="{Binding EffortsString}" FontSize="24" VerticalOptions="Center" TextColor="{x:Static common:ColorResources.NavigationBarColor}" /> </StackLayout> 种可见性属性。

ObservableCollection

绑定 public class ProjectListWithTasksModel : List<TaskModel> { public List<TaskModel> Tasks => this; public string ProjectName { get; set; } }

的模型
  public class TaskModel : ObservableObject
{
    public string TaskGUID { get; set; }
    public string TaskName { get; set; }
    public string EffortStatus { get; set; }
    public string TaskStatus { get; set; }

    private double _Effort;
    public double Effort
    {
        get { return _Effort; }
        set
        {
            _Effort = value;
            RaisePropertyChanged("Effort");
        }
    }

    public DateTime EffortDate { get; set; }
    public DateTime EffortDay { get; set; }

    //UI Models : Used for UI Changes 
    public string ProjectID { get; set; }
    public DateTime LastWorkingDay { get; set; }

    private bool _IsSaved;
    public bool IsSaved
    {
        get
        {
            if (this.EffortStatus.Contains("10"))
                _IsSaved = true;
            else
                _IsSaved = false;
            return _IsSaved;
        }
        set
        {
            _IsSaved = value;
            RaisePropertyChanged("IsSaved");
        }


    }

    public bool IsSubmitted
    {
        get
        {
            if (this.EffortStatus.Contains("20"))
            {
                return true;
                //&& LastWorkingDay.Date >= DateTime.Now.Date
            }
            else
                return false;
        }
    }

    public bool IsApproved
    {
        get
        {
            if (this.EffortStatus.Contains("30"))
            {
                return true;
            }
            else
                return false;
        }
    }

    public bool IsRejected
    {
        get
        {
            if (this.EffortStatus.Contains("40"))
            {
                return true;
            }
            else
                return false;
        }
    }

    public string _EffortsString;
    public string EffortsString
    {
        get
        {
            _EffortsString = TimeSpan.FromHours(Effort).ToString("hh':'mm") + " h";
            return _EffortsString;
        }
        set
        {
            _EffortsString = value;
            RaisePropertyChanged("EffortsString");
        }
    }

    private bool _IsNotSaved;
    public bool IsNotSaved
    {
        get
        {
            if (this.EffortStatus.Contains("0 "))
                _IsNotSaved = true;
            else
                _IsNotSaved = false;

            return _IsNotSaved;
        }
        set
        {
            _IsNotSaved = value;
            RaisePropertyChanged("IsNotSaved");
        }
    }
}

任务模型:

mExpertsList = new ArrayList<Expert>();  // You are initializing your list with size 0
loadData();  // Calling the API which will run in background

1 个答案:

答案 0 :(得分:1)

我认为问题在于IsSaved依赖于EffortStatus,所以你不应该为“IsSaved”设置“Set”。我认为当我设置EffortStatus时你应该“RaiseProperty”IsSaved(和IsNotSaved)。类似的东西:

   public string EffortStatus
    {
        get
        {
            return _EffortStatus;
        }
        set
        {
            _EffortStatus= value;
            if (_EffortStatus.Contains("10"))
                IsSaved = true;
            else
                IsSaved = false;
            RaisePropertyChanged("EffortStatus");
            RaisePropertyChanged("IsSaved");
        }


    }