【问题标题】:StackLayout Visibility doesn't changed on Property Change in ListViewStackLayout Visibility 在 ListView 中的属性更改上没有改变
【发布时间】:2018-03-15 22:59:37
【问题描述】:

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

我在ListView 中有许多StackLayout,它们的可见性会随着 ListView 的点击而改变。

内部的所有其他属性都会对 PropertyChange 做出反应,但 StackLayout 的可见性不会。

所有这些都在UI Thread 上完成。

其他人有/遇到过这个问题吗?

在循环中更新 UI

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";

                        });

IsSavedIsNotSavedbool,它们绑定到 ListView 内的 StackLayout 可见性属性。

   <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");
        }
    }
}

【问题讨论】:

  • 你应该发布你的代码
  • @AlessandroCaliaro 嘿,我已经发布了!
  • 你能发布TaskModel吗?
  • @AlessandroCaliaroDone

标签: xaml xamarin.forms


【解决方案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");
        }


    }

【讨论】:

  • 嘿!它有帮助。谢谢!
猜你喜欢
  • 2016-09-15
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
相关资源
最近更新 更多