【问题标题】:Xamarin Forms CustomCell in Listview Button Background binding not working?Listview按钮背景绑定中的Xamarin Forms CustomCell不起作用?
【发布时间】:2017-02-22 10:35:29
【问题描述】:

我有一个共享的 Xamarin.Forms 项目,该问题仅存在于 Android 上。我的问题是,我有一个列表视图,当我单击自定义单元格中的按钮时,它会改变颜色(从蓝色变为绿色)。然后我单击另一个按钮打开另一个页面,当我关闭该页面时,该项目将从列表视图中删除。但是现在被移除的项目下面的项目有一个绿色按钮,而不是蓝色。 这是一个例子:

  1. 第一张图片 - 显示 ListView,其中包含一个 customcell,其中包含信息和 2 个按钮,请注意它们是蓝色的。

  1. 第二张图片 - 显示我按下了第一个按钮,现在它变成了绿色。

  1. 第三张图片 - 显示当我按下第二个按钮时被推送的页面。

  1. 第四张图片 - 现在我之前点击了图片上的“Bekræft”按钮,消息已发送到 Listview 页面以从列表中删除 RouteElement(它确实如此)。但是现在第一个按钮是绿色的,即使它没有被按下。

RouteElement 模型。

 public class RouteElement : INotifyPropertyChanged
 {
    string arrivalBtnColor;
    public event PropertyChangedEventHandler PropertyChanged;

    public DateTime ArrivalTime { get; set; }
    public DateTime DepartureTime { get; set; }
    public bool ReadyForService { get; set; }
    public bool DeliveredToService { get; set; }
    public string ArrivalBtnBColor
    {
        get { return arrivalBtnColor; }
        set
        {
            if (arrivalBtnColor != value)
            {
                arrivalBtnColor = value;
                OnPropertyChanged("ArrivalBtnBColor");
            }
        }
    }
    public RouteElement()
    {
        this.ArrivalBtnBColor = "Default";
    }
    protected virtual void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this,
                new PropertyChangedEventArgs(propertyName));
        }
    }

自定义单元

Button ArrivalBtn = new Button
  {
    Text = "Ankomst",
    FontSize = 24,
    BorderRadius = 10,
    HeightRequest = 75,
    TextColor = Color.FromHex("#FFFFFF")
  };
 ArrivalBtn.SetBinding(Button.BackgroundColorProperty, "ArrivalBtnBColor",BindingMode.Default, new StringToColorConverter(), null);

Label PostalNoLbl = new Label()
            {
                TextColor = Color.Black,
                HorizontalTextAlignment = TextAlignment.Center,
                VerticalOptions = LayoutOptions.Start,
                FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label))
            };
            PostalNoLbl.SetBinding(Label.TextProperty, "Postcode");
            PostalNoLbl.SetBinding(Label.IsVisibleProperty, "Postcode", BindingMode.Default,new StringToBoolConverter(),null);

然后我调用这个 MessagingCenter 函数从导航中的另一个页面中删除。

MessagingCenter.Subscribe<RouteElement>(this, "Refresh",(sender) =>
{
   RouteElement r = (RouteElement)sender;
   rOC.Remove(r);
}

现在第二个 RouteElement 的按钮是绿色的,尽管它应该是蓝色的。任何帮助深表感谢!

此“错误”仅发生在具有最新 Xamarin.Forms 包的 Android 上

<package id="Xamarin.Forms" version="2.3.3.193" targetFramework="monoandroid70" />

使用这个 Xamarin.Forms 包在 Android 上运行良好

<package id="Xamarin.Forms" version="2.2.0.31" targetFramework="monoandroid70" />

【问题讨论】:

  • 能否分享完整的项目以快速重现问题?
  • @YuriS - 不能那样做。
  • 测试项目很有用。
  • @JesperHøjer 如果没有完整的 CustomCell 代码,很难判断出什么问题
  • 通过查看 SetBinding 语法,您正在使用一些第三方库来设置绑定。您可以发布 SetBinding 正在做什么的源代码吗?同样正如@YuriS 所说,您需要发布 CustomCell 的源代码。

标签: xamarin xamarin.android xamarin.forms


【解决方案1】:

您是否正在为您的 ListView 定义 ListViewCachingStrategy?你可以试试:

_listView = new ListView(ListViewCachingStrategy.RecycleElement);

_listView = new ListView(ListViewCachingStrategy.RetainElement);

ListView 可能错误地重用了旧单元格中的颜色(但不是文本/内容)。

【讨论】:

  • 目前正在测试您的解决方案。
  • RecycleElement 将在按钮上工作,但它会弄乱自定义单元格中的文本,因此它知道被安排在左侧。
  • 这很奇怪。能否将文本标签的代码贴在 CustomCell 中?
  • 已添加。我开始认为它与滚动缓存有关,您知道如何在 Xamarin Forms 中更改它吗?
  • 如果现在只是Label,尝试将Horizo​​ntalAlignment设置为Center而不是Horizo​​ntalTextAlignment
【解决方案2】:

适用于 2.2x,但不适用于 2.3x。
2.3x 有很多错误,可以在这里阅读

https://forums.xamarin.com/discussion/77854/xamarin-forms-2-3-3-193/p2

开发者建议使用 2.2x,因为 bug 太多。我也建议。

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 2021-07-21
    • 2019-03-25
    • 1970-01-01
    • 2021-10-10
    • 2018-01-03
    相关资源
    最近更新 更多