【问题标题】:IsVisible Binding is not working in Xamarin.FormsIsVisible 绑定在 Xamarin.Forms 中不起作用
【发布时间】:2019-10-24 13:28:29
【问题描述】:

我有一个典型的标签,我想通过一个是否为空/空的属性来控制它的可见性。

我已经设置了断点并记录了,看起来返回值是真的,但它仍然没有显示元素。当我滚动我的列表视图时,它们是可见的,但有时仍然不可见.. 有几个项目,有时其中一些可见,有时不可见.. 它是可变的..
这是我的转换器

public class TestBooleanConverter : IValueConverter
{

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var result=  value != null && !value.ToString().Equals("");
        Console.WriteLine("Result: " +result);
        return result;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

和属性

    public string LocalizedReadoutDescription
    {
        get
        {
            Console.WriteLine("Description: " + dataItem.Description);
            string localizedDescription = null;
            if (!string.IsNullOrEmpty(this.dataItem.Description))
            {
                string[] descriptionKeyParts = this.dataItem.Description.Split(';');
                localizedDescription = descriptionKeyParts[0];
                if (!string.IsNullOrEmpty(localizedDescription))
                {
                    localizedDescription = 
                   this.getLocalizedString(Constants.Localization.LogicalItemDescriptionFmt, 
                     localizedDescription);
                }
            }

            return localizedDescription;
        }
    }

和 Xaml 代码

<ContentView.Resources>
  <converters:TestBooleanConverter x:Key="nullToBoolConverter"/>
   .....
</ContentView.Resources>

    .....

<StackLayout Orientation="Horizontal" Margin="4,2" Grid.Column="1"  VerticalOptions="StartAndExpand" 
 HorizontalOptions="FillAndExpand" Spacing="0" BackgroundColor="White">
       <StackLayout.GestureRecognizers>
          <TapGestureRecognizer Tapped="Help_Tapped" CommandParameter="{Binding}"/>
       </StackLayout.GestureRecognizers>
       <Label x:Name="HelpLabel" Style="{StaticResource InfoIconLabel}" Text="{x:Static resx:UI.Icon_Info}" Margin="0" 
        HorizontalOptions="EndAndExpand" VerticalOptions="Start" IsVisible="{Binding LocalizedReadoutDescription,
       Converter={StaticResource nullToBoolConverter}}" FontSize="Micro" LineBreakMode="NoWrap"/>
 </StackLayout>

我觉得,即使它返回true,但它使用之前的行值。但只有这部分不更新。标签名称,值已更新,但只有某些项目的可见性未更新..

我的错误在哪里?

更新:

我已经为要控制其可见性的标签的属性更改创建了一个事件。我可以看到,IsVisible 始终为真,但在 GUI 上,只有一个项目是可见的.. 但是当我滚动时,有几个是可见的,当我滚动更多时,所有项目都是可见的,因为它必须是

    private void HelpLabel_OnPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName.Equals("IsVisible"))
        { 
           // I check => ((Xamarin.Forms.Label)sender).IsVisible 
           //always true
       }
    }

【问题讨论】:

  • 您绑定到LocalizedReadoutDescription,但您的属性名为LocalizedParamDescription
  • @Jason 谢谢你的评论。抱歉,我添加了错误的代码。我刚刚修好了
  • 如果这发生在 ListView 的上下文中,则可能是缓存问题。此外,如果您要动态更新值,则需要使用 INotifyPropertyChanged
  • 值不会动态变化..缓存似乎更合乎逻辑..我正在使用telerik的列表视图
  • XAML显示后LocalizedReadoutDescription的值会变吗?也就是说,您是否希望这些东西一开始是可见的,然后隐藏起来?如果是这样,您将如何通知 UI LocalizedReadoutDescription 的值已更改并且需要更新目标属性?如果您认为某些行正在显示其他行的值,那可能是您的视图模型类中的错误。 Telerik 的代码已投入生产并被广泛使用,因此与您目前编写的代码相比,它的测试和调试可能要好得多。

标签: xaml xamarin.forms data-binding visibility radlistview


【解决方案1】:

我发现了问题。它与缓存或通知 UI 元素无关。不知何故,这是关于项目的高度。我给了一个 height 和 heightrequest 值,然后它总是有效..很奇怪..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-02
    • 2022-01-14
    • 2018-04-11
    • 2020-02-06
    • 2018-12-09
    • 2019-04-29
    • 1970-01-01
    相关资源
    最近更新 更多